Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
comfilepi:monoserialport:index [2026/02/15 19:15] – [모노에서 시리얼 포트 제어하기] admincomfilepi:monoserialport:index [2026/02/20 15:34] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== 모노에서 시리얼 포트 제어하기 ====== ====== 모노에서 시리얼 포트 제어하기 ======
  
-모노 프레임에서  SerialPort 클래스는 DataRecevied 이벤트를 제공하지 않습니다. 따라서 수신데이터를 로 확인해주는 방을 야합니다.+==== 주의 사항: 모노(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>
 ===== 예제 프로그램 ===== ===== 예제 프로그램 =====