清除C#中的串口接收缓冲区

只想知道我们如何在C#中清除串口的接收缓冲区。 好像接收缓冲区中的数据只是不断积累。 例如,输入数据流是:[数据A],[数据B],[数据C]。 我想要的数据只是[数据C]。 我想这样做,当我收到[数据A]和[数据B]时,我会做一个明确的缓冲区。 只有收到[数据C]时,我才会继续处理。 这是用C#做的吗?

如果您使用的是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 } } 

使用port.DiscardOutBuffer(); and port.DiscardInBuffer(); port.DiscardOutBuffer(); and port.DiscardInBuffer(); 清除串口缓冲区

你可以使用喜欢

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

有两个缓冲区。 一个缓冲区与串行端口相关联,另一个缓冲区与其基本流相关联,其中来自端口缓冲区的数据被流入。 DiscardIn Buffer()只是从丢弃的串行端口缓冲区中获取数据。 您将阅读的基本流中仍有数据。 因此,除了使用DiscardInBuffer之外,还使用SP.BaseStream.Flush()。 现在你有一个干净的石板! 如果您没有获得大量数据,只需删除基本流:SP.BaseStream.Dispose()。

由于您仍然收到数据接收事件,因此您可以阅读它并且不会让您自己处于丢失数据的危险之中。