Differences

This shows you the differences between two versions of the page.


Previous revision
comfilepi:monoserialport:index [2026/02/20 15:34] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== 모노에서 시리얼 포트 제어하기 ======
  
 +==== 주의 사항: 모노(Mono) 프레임워크 제약 ====
 +모노(Mono) 프레임워크 환경에서 사용하는 ''SerialPort'' 클래스는 **DataReceived 이벤트를 지원하지 않습니다.**
 +
 +  * **현상:** 데이터가 수신되어도 이벤트 핸들러가 자동으로 호출되지 않음.
 +  * **이유:** 리눅스/임베디드 OS와의 호환성 문제로 인해 윈도우 .NET의 이벤트 방식이 제한됨.
 +
 +====  해결 방법: 폴링(Polling) 방식 구현 ====
 +데이터 수신을 위해 자동 알림 방식 대신, 프로그램이 직접 수신 버퍼를 주기적으로 확인하는 **폴링(Polling) 방식**을 사용해야 합니다.
 +
 +
 +
 +=== 구현 가이드라인 ===
 +  - **별도 스레드 생성:** 메인 UI가 멈추지 않도록 수신 전용 스레드를 생성하십시오.
 +  - **BytesToRead 확인:** 루프 내에서 ''serialPort.BytesToRead > 0'' 인지 수시로 체크합니다.
 +  - **적절한 지연(Sleep):** 무한 루프 시 CPU 점유율 과다 방지를 위해 반드시 ''Thread.Sleep(10)'' 정도의 대기 시간을 포함하십시오.
 +
 +<code csharp>
 +// 예시 코드 (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();
 +</code>
 +===== 예제 프로그램 =====
 +
 +클라이언트와 서버간의 단순 통신 예제입니다. 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#추가설명|상위 페이지로 이동]]