====== 모노에서 시리얼 포트 제어하기 ====== ==== 주의 사항: 모노(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)에서 응답을 합니다. | {{ :comfilepi:monoserialport:client.png?nolink&500 |}} | {{ :comfilepi:monoserialport:server.png?nolink&500 |}} | {{ :comfilepi:monoserialport:datetimequery.zip | [소스 다운로드]}} [[comfilepi:index#추가설명|상위 페이지로 이동]]