This is an old revision of the document!


모노에서 시리얼 포트 제어하기

시리얼 통신(SerialPort) 수신 가이드

⚠️ 주의 사항: 모노(Mono) 프레임워크 제약

모노(Mono) 프레임워크 환경에서 사용하는 SerialPort 클래스는 DataReceived 이벤트를 지원하지 않거나 동작이 불안정할 수 있습니다.

  • 현상: 데이터가 수신되어도 이벤트 핸들러가 자동으로 호출되지 않음.
  • 이유: 리눅스/임베디드 OS와의 호환성 문제로 인해 윈도우 .NET의 이벤트 방식이 제한됨.

✅ 해결 방법: 폴링(Polling) 방식 구현

데이터 수신을 위해 자동 알림 방식 대신, 프로그램이 직접 수신 버퍼를 주기적으로 확인하는 폴링(Polling) 방식을 사용해야 합니다.

구현 가이드라인

  1. 별도 스레드 생성: 메인 UI가 멈추지 않도록 수신 전용 스레드를 생성하십시오.
  2. BytesToRead 확인: 루프 내에서 serialPort.BytesToRead > 0 인지 수시로 체크합니다.
  3. 적절한 지연(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)에서 응답을 합니다.

[소스 다운로드]

상위 페이지로 이동