Differences

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

Link to this comparison view

Next revision
Previous revision
comfilepi:monoserialport:index [2026/02/15 19:05] – created - external edit 127.0.0.1comfilepi:monoserialport:index [2026/02/20 15:34] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== 모노에서 시리얼 포트 제어하기 ====== ====== 모노에서 시리얼 포트 제어하기 ======
  
-모노 프레임에서  SerialPort 클래스는 DataRecevied 이벤트를 제공하지 않습니다. 따라서 수신데이터를 수시로 확인해주는 방법을 쓰거나 아니면 다음과 같은 방법으로 해결가능합니다.+==== 주의 사항: 모노(Mono) 프레임워크 제약 ==== 
 +모노(Mono) 프레임워크 환경에서 사용하는 ''SerialPort'' 클래스는 **DataReceived 이벤트를 지원하지 않습니다.**
  
-    [[https://antanas.veiverys.com/mono-serialport-datareceived-event-workaround-using-a-derived-class/|Mono SerialPort.DataReceived 이벤트 해결 – 파생 클래스]] +  **현상:** 데이터가 수신되어도 이벤트 핸들가 자동으로 호출되지 않음
-      * 이한 해결 방법을 구현한 솔루션: [[http://110.10.189.172/ComfilePi/Comfile.ComfilePi.SerialPortExample.zip|Visual Studio 솔루션 다운로드]] +  * **이유:** 리눅스/임베디드 OS와의 호환성 문제로 인해 윈도우 .NET의 이벤트 방식이 제한됨.
-    [[http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport#comment-840|If you *mustuse .NET System.IO.Ports.SerialPort ]]+
  
 +====  해결 방법: 폴링(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>
 ===== 예제 프로그램 ===== ===== 예제 프로그램 =====