Table of Contents
모노에서 시리얼 포트 제어하기
주의 사항: 모노(Mono) 프레임워크 제약
모노(Mono) 프레임워크 환경에서 사용하는 SerialPort 클래스는 DataReceived 이벤트를 지원하지 않습니다.
- 현상: 데이터가 수신되어도 이벤트 핸들러가 자동으로 호출되지 않음.
- 이유: 리눅스/임베디드 OS와의 호환성 문제로 인해 윈도우 .NET의 이벤트 방식이 제한됨.
해결 방법: 폴링(Polling) 방식 구현
데이터 수신을 위해 자동 알림 방식 대신, 프로그램이 직접 수신 버퍼를 주기적으로 확인하는 폴링(Polling) 방식을 사용해야 합니다.
구현 가이드라인
- 별도 스레드 생성: 메인 UI가 멈추지 않도록 수신 전용 스레드를 생성하십시오.
- BytesToRead 확인: 루프 내에서
serialPort.BytesToRead > 0인지 수시로 체크합니다. - 적절한 지연(Sleep): 무한 루프 시 CPU 점유율 과다 방지를 위해 반드시
Thread.Sleep(10)정도의 대기 시간을 포함하십시오.
// 예시 코드 (C#) Thread receiveThread = new Thread(() => { while (serialPort.IsOpen) { if (serialPort.BytesToRead > 0) { // 데이터 읽기 처리 string data = serialPort.ReadExisting(); Console.WriteLine("Received: " + data); } Thread.Sleep(10); // CPU 부하 방지용 (필수) } }); receiveThread.Start();
예제 프로그램
클라이언트와 서버간의 단순 통신 예제입니다. C#을 사용해서 짠 소스입니다.
Server.exe 는 PC에서 실행시키고, Client.exe 는 ComfilePi에서 실행시키세요. 물론 PC와 ComfilePi는 RS232C로 연결되어 있어야 합니다. ComfilePi에서 date 또는 time 을 타이핑하면, PC측 (server)에서 응답을 합니다.
| |
