2012-07-20 5 views
10

C#에서 직렬 포트의 수신 버퍼를 지우는 방법을 알고 싶습니다. 수신 버퍼의 데이터가 누적되는 것처럼 보입니다. 예를 들어 들어오는 데이터의 흐름은 [Data A], [Data B], [Data C]입니다. 원하는 데이터는 [데이터 C]뿐입니다. 나는 [Data A]와 [Data B]를 받았을 때 명확한 버퍼를 사용하는 것처럼 생각하고 있습니다. [Data C]가 수신 된 경우에만 프로세스를 계속 진행합니다. 이게 C#에서 할 수있는 방법인가요?C에서 직렬 포트 수신 버퍼 지우기 #

+0

어떻게 시리얼 포트를 사용하고 있습니까? 'System.IO.Ports.SerialPort'를 사용하고 있습니까? – Dai

답변

12

당신은 다음 두 가지 방법 사용할 수있는 System.IO.Ports.SerialPort을 사용하는 경우 버퍼를 플러시

DiscardInBuffer()DiscardOutBuffer()을. 당신이

port.DiscardOutBuffer(); 
port.DiscardInBuffer(); 
port.Close(); 
port.DataReceived -= new SerialDataReceivedEventHandler(onDataReceived); 
port = null; 
+0

도움을 주셔서 감사합니다. 송신기는 항상 데이터를 전송합니다. 단지 내 C# 프로그램 인 수신기가 항상 처리 할 데이터를 수신하지 못한다는 것입니다. 데이터를 처리하지 않으면 수신 버퍼에 데이터가 누적됩니까? 그런 다음 수신 데이터를 처리하지 않을 때 항상 DiscardInBuffer()를 수행해야합니까? – maniac84

+0

@ maniac84 네 괜찮을 것입니다. 또는 버퍼를 읽을 수 있으며 응용 프로그램 논리에서 단순히 수신 된 데이터를 무시하십시오. 항상 유사한 종료 문자가 있습니까? 내 편집을 참조하십시오. – Simon

7

사용 port.DiscardOutBuffer(); and port.DiscardInBuffer(); 시리얼 포트 버퍼

2

을 취소 한 개의 버퍼가 있습니다

하면 직렬 포트에서 데이터를 읽고 있다면. 하나의 버퍼는 직렬 포트와 연결되고 다른 하나는 포트 버퍼의 데이터가 스트리밍되는 기본 스트림과 연결됩니다. DiscardIn Buffer()는 폐기 된 직렬 포트 버퍼에서 데이터를 가져옵니다. 베이스 스트림에는 여전히 읽을 데이터가 있습니다. 따라서 DiscardInBuffer를 사용하는 대신 SP.BaseStream.Flush()도 사용하십시오. 이제 깨끗한 슬레이트가 생겼어! 많은 양의 데이터를 얻지 못하면 기본 스트림을 제거하면됩니다. SP.BaseStream.Dispose().

데이터 수신 이벤트가 계속 발생하여 읽을 수 있으며 데이터 유실 위험에 처하지 않습니다.

2

처럼 사용할 수 있습니다

private void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    if (!this.Open) return; // We can't receive data if the port has already been closed. This prevents IO Errors from being half way through receiving data when the port is closed. 
    string line = String.empty; 
    try 
    { 
     line = _SerialPort.ReadLine(); 
     line = line.Trim(); 
     //process your data if it is "DATA C", otherwise ignore 
    } 
    catch (IOException ex) 
    { 
     //process any errors 
    } 
}