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

16

我想了解如何在C#中清空串口接收缓冲区。看起来接收缓冲区中的数据一直在累积。 例如,接收到的数据流为:[数据A]、[数据B]、[数据C]。而我需要的仅是[数据C]。 我考虑的方法是,在接收到[数据A]和[数据B]时,清空缓冲区。只有当接收到[数据C]时,才继续处理。这是在C#中实现的方法吗?


你是如何使用串口的?你在使用 System.IO.Ports.SerialPort 吗? - Dai
4个回答

18
如果您正在使用 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
    }
}

感谢您的帮助。我的发射器将始终传输数据。只是我的C#程序作为接收器并不总是接收到要处理的数据。如果我没有处理数据,接收缓冲区会积累数据,对吗?那么当我不处理接收数据时,我是否需要始终执行DiscardInBuffer()操作呢? - maniac84
@maniac84 是的,这应该没问题。或者你可以读取缓冲区,在你的应用程序逻辑中,简单地忽略接收到的数据。是否总是有类似的终止字符?请看我的编辑。 - Simon

15

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


对于使用CP21xx UART-to-USB转换器的用户,请注意自2022年底起,CP21xx芯片将有效地忽略“Discard Buffer”命令,您现在需要手动从串口读取数据。请参阅此链接 - Andrejs Gasilovs

7
有两个缓冲区。一个缓冲区与串行端口相关联,另一个缓冲区与其基础流相关联,串行端口缓冲区中的数据会被流入到基础流缓冲区中。DiscardIn Buffer() 只是将串行端口缓冲区中的数据丢弃。基础流中仍然有数据需要读取。因此,在使用 DiscardInBuffer 的同时,还要使用 SP.BaseStream.Flush()。现在你有了一个干净的板子!如果没有大量数据,只需摆脱基础流:SP.BaseStream.Dispose()。
由于您仍在接收数据事件,因此可以读取数据而不会使自己失去数据。

6
您可以使用类似于的方式
port.DiscardOutBuffer();
port.DiscardInBuffer();
port.Close();
port.DataReceived -= new SerialDataReceivedEventHandler(onDataReceived);
port = null;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接