SerialPort 클래스 사용법

마이크로소프트는 .Net Framework 2.0 이후부터 Serial Communication 을 위하여 SerialPort 라는 클래스를 제공하고 있습니다.

마이크로소프트 MDSN Link : http://msdn2.microsoft.com/ko-kr/library/system.io.ports.serialport.aspx

System.IO.Ports 네임스페이스에 존재하는 이 SerialPort 클래스를 이용하면 별다른 어려움없이 시리얼통신 기능을 구현 할 수 있습니다. 상세한 사용방법은 MSDN을 통해서 익히도록 하고, 사용시에 팁이 될만한 내용을 정리해 보도록 하겠습니다.

– ReadTimeout, WriteTimeout 속성을 SerialPort.InfiniteTimeout으로 설정하여 ReadTimeout Exception이 발생하지 않도록 합니다.

시리얼 포트를 통해서 데이터를 Read할 때 간헐적으로 ReadTimeout Exception이 발생합니다. 이러한 현상을 방지하기 위해서 ReadTimeout 속성에 SerialPort.InfiniteTimeout값을 설정하여 시간제한이 없도록 설정합시다.

– ReadBytesThreshold 와 DataReceived 이벤트

데이터 수신 이벤트는 ReadBytesThreshold에 설정된 바이트 수 이상 수신될 때 발생하게 됩니다. 만일 이 값이 낮게 설정 되어 있을 경우 이벤트가 전체 데이터가 수신되기 전에 발생 할 수 있고, 높에 설정되어 있으면 이벤트가 발생하지 않을 수도 있습니다. 

MSDN에는 다음과 같이 명시되어 있습니다.

'내부 입력 버퍼의 바이트 수와 ReceivedBytesThreshold 속성 값에 관계없이 파일 끝 바이트를 받은 경우에도 DataReceived 이벤트가 발생할 수 있습니다.'

– 데이터가 나뉘어 수신되는 현상 해결방법

.Net Framework의 SerialPort 클래스는 데이터수신시 보조스레드를 이용하여 이벤트를 발생 시킵니다. 이벤트가 발생된 시점에서도 데이터가 계속해서 수신될 수 있으므로 한번의 이벤트로 모든 데이터를 전부 수신 못 할 수도 있습니다.

예를 들자면, ReadBytesThreshold 값을 1로 설정 하고 총20바이트의 데이터가 수신된다고 생각해봅시다. 시리얼 포트를 통해 데이터가 수신될 때 1바이트 수신된 시점에서 SerialPort 클래스는 데이터 수신 이벤트를 발생시킵니다. 사용자가 이벤트 내부에서 값을 읽어가는 도중에도 데이터가 수신중이므로 BytesToRead 속성에 나타나는 값은 상황에따라 틀릴것입니다.

이러한 현상을 해결하기 위한 가장 쉬운 방법은 데이터 수신 이벤트에서 데이터를 수신하기 전에 System.Threading.Thread.Sleep(100) 함수를 이용해서 일정시간동안 멈추었다가 수신하는 방법입니다.

또한 이벤트가 발생한 시점간의 시간차이를 계산해서 이전수신 데이터와 병합해서 처리하는 방법도 존재합니다.

zemna

Programmer/Web/Mobile/Desktop

You may also like...

Leave a Reply