정보공간_1

[3기 신촌 최기환] WPF 활용 - 시리얼 통신 본문

IT 놀이터/Elite Member Tech & Talk

[3기 신촌 최기환] WPF 활용 - 시리얼 통신

알 수 없는 사용자 2013. 5. 10. 18:37

안녕하세요 신촌 멤버십 21-2기 최기환입니다.

이번시간은 WPF 기반의 프로그램에서 시리얼통신을 하는 방법에 대해 알아보도록 하겠습니다.

시리얼 통신은 연속적으로 통신채널이나 컴퓨터 버스를 거쳐 한번에 하나의 비트 단위로 데이터를

전송하는 과정을 말합니다.

PC의 어플리케이션들은 시리얼 포트를 COM 포트로 인식하며

.NET 프레임워크 클래스 라이브러리에 포함된 SerialPort 클래스가 COM 포트를 사용할 수 있게 합니다.

데이터를 주고 받을 때 ASCII 값 혹은 HEX 값을 이용합니다.





시리얼 통신을 처음 설정할 때 Port Name, Baud Rate, Data Bit, Parity Bit, Stop Bit 등을 지정할 수 있으며

SerialPort 클래스의 프로퍼티로 지정되어 있습니다.


데이터를 받았을 때 처리할 작업을 지정해 주기 위해서는 serialPort.DataReceived 라는 SerialDataReceivedEventHandler 를 이용하면 됩니다.

ex) ACKSerialPort.DataReceived += new SerialDataReceivedEventHandler(ACKSerialPort_DataReceived);


Hex 값 받기




Hex 값을 보낼 때에는 

byte[] bytes = Rs232Utils.HexStringToByteArray("02 41 43 4D 03");

ACKSerialPort.Write(bytes, 0, bytes.Length);

을 이용 하고




ASCII 값은 String 값을 바로 보내주면 됩니다.

ACKSerialPort.Write(text);


받은 데이터를 표시해 주기 위해 UI 를 변경 하는 경우 갱신이 안되는 문제가 발생합니다.

시리얼 통신에서 데이터 송신을 기다릴 때 다른 쓰레드를 사용하므로 

해당 함수 내에서 UI 쓰레드로 접근이 되지 않기 때문입니다.

이를 해결하기 위해 Invoke 를 사용합니다.


UI 객체.Dispatcher.BeginInvoke(new Action(delegate { UI 변경 내용; }));


ex) NH3TextBlock.Dispatcher.BeginInvoke(new Action(delegate { NH3TextBlock.Text = NH3Double.ToString(); }));


시리얼 통신이 종료 된후 반드시 close() 해주는 것도 잊으면 안됩니다.


또한 데이터를 주고 받을 때 반드시 데이터의 끝을 나타내는 LF(Hex 값으로 0A) 를 활용합니다.

 C# 에서는 SerialPort 클래스를 이용해 비교적 손쉽게 시리얼 통신을 구현할 수 있습니다.

Hex값과 ASCII 값 변환, UI 쓰레드 접근 에만 유의 한다면 큰 어려움은 없을 겁니다.


이상으로 WPF 환경에서의 시리얼 통신에 대한 설명을 마치겠습니다.