2012-09-25 3 views
3

에서 데이터를 읽기 나는 다음과 같은 코드를 사용하여 (즉, COM3입니다) 직렬 포트에 전송 된 데이터를 읽고있다 : 그 시리얼 포트에서 오는.NET : 시리얼 포트

_serialPort.PortName = "COM3"; 
_serialPort.BaudRate = 9600; 
_serialPort.Parity = Parity.None; 
_serialPort.DataBits = 8; 
_serialPort.StopBits = StopBits.One; 
_serialPort.ReadTimeout = 500; 
_serialPort.WriteTimeout = 500; 
_serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived); 
_serialPort.Open(); 

데이터를 명령하고 될 수 있습니다 '\ 0'으로 끝나는 길이의 문자열. 이러한 데이터를 효율적으로 읽는 방법에 대한 모범 사례를 찾고 있습니다. 어디서, 최선 수있는 생산자/소비자 패턴을 생각하고 있어요 :

  1. 모든 시간 DataReceived 이벤트가 발생, 내가 포트에서 문자열을 읽어을하고 StringBuffer를 또는 다른 구조에 추가 그때가
  2. stringbuffer 또는 char '\ 0'에 대한 구조를 지속적으로 검사하는 다른 스레드가 발견되면 명령 문자열을 구문 분석하고 제거합니다.

이 문제를 해결하는 가장 효율적인 방법이겠습니까? dataReceived 이벤트에 의존하지 않는 직렬 읽기 기능을 차단하는 종류가 있습니까?

+1

SerialPort.NewLine을 사용하여 dataReceived 이벤트가 발생하는시기를 결정할 수 있습니다. 그게 아주 유용하다고 생각합니다. – mike01010

답변

5

코드에서 이벤트가 실행될 때 dataReceieved 이벤트가 너무 자주 실행되고 SerialPort을 차단한다는 사실을 발견했습니다. 이 기능을 원할 수도 있지만 유용 할 수도 있고 그렇지 않을 수도있는 정보가 있습니다.

나는 Timer을 자주 사용합니다. 10   Hz입니다. Timer에서 SerialPort.BytesToRead > 0을 확인합니다. 그렇다면 SerialPort.ReadLine을 사용하여 한 줄의 텍스트를 읽고 많은 양의 코드를 저장하여 인바운드 버퍼를 처리합니다.

BytesToRead == 0까지의 경우 나중에 처리하기 위해 각 행을 버퍼로 읽거나 읽은 후에 직접 처리하십시오. 당신이 한 줄의 텍스트를 구성하는 아두 이노를 취하고 라인의 일부가 ReadTimeout 내에서 수신되는 경우 Exception의 원인이됩니다 얼마나 알고있는 경우

당신의 예에서 ReadTimeout 재산 유용합니다.