【问题标题】:Clear serial port receive buffer in C#在C#中清除串口接收缓冲区
【发布时间】:2017-12-13 12:10:02
【问题描述】:

只是想知道我们如何在 C# 中清除我的串口的接收缓冲区。似乎接收缓冲区中的数据只是不断累积。 例如,传入数据的流向是:[Data A]、[Data B]、[Data C]。我想要的数据只是[Data C]。 我正在考虑这样做,当我收到 [Data A] 和 [Data B] 时,我会做一个清除缓冲区。仅当收到 [Data C] 时,我才继续处理。这是在 C# 中实现的方式吗?

【问题讨论】:

  • 你是如何使用串口的?你在用System.IO.Ports.SerialPort吗?

标签: c# serial-port


【解决方案1】:

如果您使用的是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 是的,这应该没问题。或者,您可以读取缓冲区,并在您的应用程序逻辑中,简单地忽略接收到的数据。是否总是有类似的终止字符?查看我的编辑。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你可以像这样使用

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

      【讨论】:

        猜你喜欢
        • 2012-10-12
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-18
        相关资源
        最近更新 更多