2014-01-31 6 views
0

기존 응용 프로그램을 Borland C++에서 .NET으로 이식 중입니다. 응용 프로그램은 동시에 4 COM 포트를 처리하기 때문에 동기화해야하므로 한 포트가 데이터를 수신하는 동안 나머지 세 포트는 수신 버퍼의 모든 데이터를 읽을 때까지 차단됩니다.C# 다중 COM 포트 동기화

요구 사항은 새 버전이 이전 버전과 똑같은 방식으로 작동하므로 이러한 4 개의 포트를 동기화하는 방법을 찾아야합니다.

P.

SerialPort 클래스의 인스턴스가 4 개 있습니다.

다음은 COM 포트를 통해 데이터를 수신하는 처리기입니다.

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort rThis = (SerialPort)sender; 

     string existingData = rThis.ReadExisting(); 
     int NumReceived = existingData.Length; 
     if (NumReceived > 0) 
     { 
      char[] ReceivedByte = existingData.ToCharArray(); 
      // if RX bytes cannot be processed 
      if (!rThis.ProcessReceivedBytes(ReceivedByte, NumReceived)) 
      { 
       rThis.ReportThreadError(ThreadId.TI_READ, 0x07FFFFF); 
      } 
     }       
    } 

답변

0

이 방법은 스레드가 사용 중일 때 다른 포트와 상호 작용할 수 없기 때문에 가장 좋은 방법은 포트와 상호 작용하는 스레드를 하나만 사용하는 것입니다. 이것은 정확히 당신이 원하는 것입니다, 여기에 멀티 스레딩을 잊어 버려요.

그런 다음 저급 I/O 스레드를 GUI 스레드와 분리해야합니다. 따라서 잘 정의 된 API를 통해 서로 comunicate하는 두 개의 스레드로 끝납니다.

while(polling) // GUI thread may interrupt polling on user request 
{ 
    foreach(SerialPort port in serialports) 
    { 
     if(port.HasDataToRead) // this is the polling you really need 
     { 
      // read data from port and handle it accordingly 
     } 
    } 

    // ... suspend thread now and then to prevent loop from consuming CPU time 
} 

HasDataToRead는 의미, 이벤트 핸들러에 구현해야합니다 :

    낮은 수준의 I/O 스레드, 시리얼 포트를 차단하지 않고 이런 일을 폴링하는 방법이 필요

  • 이벤트 처리기에서 이벤트 을 가져와 데이터를 사용할 수 있으며 SerialPort 클래스에 HasDataToRead으로 신호를 보냅니다.
  • 이벤트 처리기의 실제 데이터를 읽지 않고 이벤트 처리기를 GUI 스레드에서 실행하는 경우 GUI를 잠글 필요가 없습니다.
  • 읽기 메서드의 끝에서 HasDataToRead 플래그를 지 웁니다. 이벤트 만 SerialPort 인스턴스 내부 플래그를 조율하는 데 사용하는 동안

정말 위의주기는 디스패처입니다. HasDataToRead 플래그

에주의, 당신은 경쟁 조건을 피하기 위해 그것을 고정해야합니다 :

lock(HasDataToRead) 
{ 
    // access HasDataToRead 
} 
+0

감사합니다,이 옵션에 대한 DataReceived 핸들러와 haven't 생각에 몰두했다. 그것을 시도해 보겠다. 호기심에 가깝다. DataReceived 핸들러를 사용하여 동일한 결과를 얻을 수 있을까? – user3244329

+0

나는 당신이 의미하는 것을 보았습니다, 미안하지만 약간의 오해. – user3244329