2012-07-20 103 views
10

只是想知道我們如何清除C#中串口的接收緩衝區。看起來好像接收緩衝區中的數據一直在積累。例如,輸入數據的流程是:[數據A],[數據B],[數據C]。我想要的數據只是[數據C]。 我正在考慮這樣做,當我收到[數據A]和[數據B]時,我做了一個明確的緩衝區。只有當收到[數據C]時,我才繼續處理。這是在C#中做到這一點的方式嗎?清除C#中的串口接收緩衝區#

+0

你如何使用串口?你在使用'System.IO.Ports.SerialPort'嗎? – Dai 2012-07-20 01:15:33

回答

12

如果您使用的是System.IO.Ports.SerialPort,那麼你可以使用這兩種方法:

DiscardInBuffer()DiscardOutBuffer()刷新緩衝區。

如果你正在閱讀從串行端口的數據:

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 
    } 
} 
+0

感謝您的幫助。我的發射機將始終傳輸數據。只是接收器是我的C#程序並不總是接收數據來處理。如果我沒有處理數據,那麼接收緩衝區將會正確地累積數據?那麼當我沒有處理接收數據時,我將不得不始終使用DiscardInBuffer()? – maniac84 2012-07-20 02:02:44

+0

@ maniac84是的,這應該沒問題。或者,您可以讀取緩衝區,並在您的應用程序邏輯中忽略收到的數據。是否總是有類似的終止字符?看我的編輯。 – Simon 2012-07-20 03:00:56

7

使用port.DiscardOutBuffer(); and port.DiscardInBuffer();清除串行端口的緩衝區

2

您可以像使用

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

有兩個緩衝器。一個緩衝區與串行端口相關聯,另一個緩衝區與其基本流相關聯,來自端口緩衝區的數據流入其中。 DiscardIn Buffer()只是從串口緩衝區中丟棄數據。基礎數據流中仍有數據,您將閱讀。因此,除了使用DiscardInBuffer之外,還可以使用SP.BaseStream.Flush()。現在你有一個乾淨的石板!如果您沒有獲取大量數據,只需刪除基本流:SP.BaseStream.Dispose()。

由於您仍然收到數據收到的事件,您可以閱讀它,而不會讓自己處於丟失數據的危險之中。