IT_Programming/WinForm (C#.NET)

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

JJun ™ 2009. 8. 25. 16:24

--------------------------------------------------------------------------------------------------

원본 출처 : http://trick14.egloos.com/4586662

--------------------------------------------------------------------------------------------------

 

안녕하세요. trick14입니다.

 

/* 중간 생략 */


이 문서에서는 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);

 

 

 

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

 

/* 이하 생략... */

 

--------------------------------------------------------------------------------------------------