只是想知道我们如何在 C# 中清除我的串口的接收缓冲区。似乎接收缓冲区中的数据只是不断累积。例如,传入数据的流向是:[Data A]、[Data B]、[Data C]。我想要的数据只是[Data C]。我正在考虑这样做,当我收到 [Data A] 和 [Data B] 时,我会做一个清除缓冲区。仅当收到 [Data C] 时,我才继续处理。这是在 C# 中执行此操作的方法吗?
问问题
79530 次
4 回答
17
如果您使用的是,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
}
}
于 2012-07-20T01:26:38.963 回答
12
用于port.DiscardOutBuffer(); and port.DiscardInBuffer();
清除串口缓冲区
于 2012-07-20T11:09:33.370 回答
5
有两个缓冲区。一个缓冲区与串行端口相关联,另一个与其基本流相关联,来自端口缓冲区的数据流入其中。DiscardIn Buffer() 只是从被丢弃的串行端口缓冲区中获取数据。您将读取的基本流中仍有数据。所以,除了使用 DiscardInBuffer 之外,还要使用 SP.BaseStream.Flush()。现在你有一个干净的石板!如果您没有获得大量数据,只需删除基本流:SP.BaseStream.Dispose()。
由于您仍在收到数据接收事件,因此您可以阅读它而不会让自己处于丢失数据的危险之中。
于 2017-09-17T04:19:08.233 回答
5
你可以使用喜欢
port.DiscardOutBuffer();
port.DiscardInBuffer();
port.Close();
port.DataReceived -= new SerialDataReceivedEventHandler(onDataReceived);
port = null;
于 2015-12-29T11:45:49.557 回答