본문 바로가기
프로그래밍

.NET C#을 이용한 Serial 통신 구현.

by 건우아빠유리남편 2010. 4. 21.
반응형



Serial.NET.zip

일단 소스는 개인적인 용도로만 사용하시고요. 본래 .NET CF에서 사용하려고 만들었습니다. .NET CF2.0에선 잘 도는데 3.5에선 하위호환성이 없는건지(-_-?) 안돌더라구요. 여튼 궁금하신 사항은 언제든지 리플달아주세요.

오랜만에 Programming카테고리에 포스팅을 하는데요. 전부터 한다한다 하고 안했던 내용을 하나 짬내서 만들어보았습니다. 어려운 내용이 아니라 도움이 되실지 모르겠지만 필요하신분들 참고하시면 되겠습니다~

이 문서의 아래쪽에 첨부된 소스를 이용하면 아래와 같은 어플리케이션이 생성됩니다.


이 문서에서는 C# 닷넷 플랫폼을 이용해서 시리얼 포트로 통신하는 방법에 대해 살펴보겠습니다. Win32 API를 이용한 방법들이야 이미 많이 다루어 졌던 내용이지만 닷넷을 이용한 방법이라고 웹에 올라와 있는 문서들을 보니 대부분 Win32 DLL을 불러와 사용하는, 실제로는 Win32 API를 이용한 방법과 동일한 내용들뿐이었습니다.

  

먼저 닷넷프레임워크에서는 System.IO.Port라는 시리얼IO를 위한 네임스페이스를 제공합니다. 이 네임스페이스에서 제공하는 다양한 클래스들을 사용하여 시리얼 포트를 제어할 수 있으며 아래와 같은 방법으로 네임스페이스를 프로젝트에 추가해 줍니다.

 

using System.IO.Ports;

 

 

 System.IO.Port네임스페이스에는 SerialPort라는 클래스가 있으며 이 클래스를 통해 시리얼 포트에 대한 제어를 할 수 있습니다.

 

먼저 아래와 같은 방식으로 시리얼 포트 객체를 선언합니다.

 

SerialPort SP = new SerialPort();

 

  

Baud rate, Stop bits, Data bits등 시리얼 통신을 위한 여러 설정들은 아래와 같은 방법으로 정의할 수 있습니다. 아래에 예에서 적용된 설정들은 이 설정들을 적용하지 않았을 경우 default값으로 적용되는 값들입니다.

 

SP.PortName = "COM1";

SP.BaudRate = (int)38400;

SP.DataBits = (int)8;

SP.Parity = Parity.None;

SP.StopBits = StopBits.One;

SP.ReadTimeout = (int)500;

SP.WriteTimeout = (int)500;

 

 

실제 사용 가능한 시리얼 포트는 SerialPort.GetPortNames() 메소드로 얻어 올 수 있기 때문에 foreach문을 사용하면 모든 사용 가능한(물리적으로) 시리얼 포트를 찾을 수 있습니다.

 

foreach (string comport in SerialPort.GetPortNames())

{

}

 

 

Parity로 사용할 수 있는 값은 EVEN, MARK, NONE, ODD, SPACE 입니다.

Stop Bits로 사용할 수 있는 값은 None, One, OnePointFive, Two 입니다.

  

여기까지 설정이 끝났다면 단순히 Open() 메소드를 사용하여 적용된 설정과 함께 포트를 열 수 있으며 IsOpen을 이용하여 포트가 정상적으로 열렸는지 확인 할 수 있습니다. 필요한 Exception에 대한 핸들링도 주로 이곳에서 하게 됩니다.

 

SP.Open();

 

if (SP.IsOpen)

{   // 포트 오픈 성공

}

else

{   // 포트 오픈 실패.

}

 

  

정상적으로 포트가 열렸다면 Read/Write작업에 대해 알아보겠습니다.

 

SP.WriteLine("Its a test.");

SP.ReadLine()

 

 

Read작업의 경우 ReadByte, ReadChar, ReadExisting, ReadLine 중 필요한 메소드를 골라서 사용하시면 됩니다.

 

Win32에서 Read작업의 경우 쓰레드를 만들고 이벤트를 감시하여 해당 이벤트(시리얼로 데이터가 들어오는)가 발생하면 특정 루틴으로 넘겨주는 방법을 사용했는데 닷넷에서도 마찬가지의 방법을 사용합니다.

 

void SP_DataRecieved(Object sender, SerialDataReceivedEventArgs e)

{

SP.ReadLine();

}

 

SP.DataReceived += new SerialDataReceivedEventHandler(SP_DataRecieved);

 

 

 

이렇게 해서 간단히 닷넷을 이용한 시리얼 포트제어 방법을 알아보았습니다. 기본적인 시리얼에 대한 내용은 제가 이전에 작성한 문서를 참고하셔도 되고 이미 많은 자료들이 있기 때문에 따로 첨부하진 않겠습니다.

 

닷넷에서 워낙 편리하게 사용할 수 있는 여러 클래스를 제공해 주고 있기 때문에 MSDN문서만 찾아보셔도 손쉽게 구현하실수 있으리라 믿으며 제가 만들어둔 소스를 함께 첨부합니다. ( 수정: 소스 뺏습니다. 필요하신분은 문의주세요.)


출처 : http://trick14.egloos.com/4586662
반응형

댓글