c# - 如何正确使用SerialPort.DiscardInBuffer?

标签 c# .net serial-port

我编写了一个以非常快的速度从串行设备读取数据的应用程序。然而,串行端口对象在连续运行约 20 分钟后未能触发 DataReceieved 事件。以编程方式断开和重新连接串行允许事件再次工作,但仅再持续 20 分钟。

我尝试在每次 DataReceived 事件后使用 DiscardInBuffer,这似乎已经解决了问题。但该方法会消耗大量 CPU 时间,并且会降低应用程序的性能。 MSDN 提到方法“丢弃串行驱动程序的接收缓冲区中的数据。”,但没有建议何时使用它。

应该何时以及如何使用 DiscardInBuffer,我是否在针对我的特定问题的正确上下文中使用它?

编辑:

实现ErrorReceived 事件后,返回的事件数据表明事件类型为“RXOver”。

最佳答案

经过更多调查,我的问题似乎更像是一个基本问题。由于数据以极快的速度涌入,因此需要连续清除或处理 SerialPort 缓冲区,以防止出现“RXOver”错误。我通过在 DataReceived 事件期间读入另一个缓冲区并在另一个单独的线程中处理它来实现这一点。

根据我的理解,DiscardInBuffer 应该只选择性地用于清除端口的内容以进行初始化,例如在打开端口之前。清除驱动程序缓冲区的过程确实需要一些时间才能完成,因此应该在以性能为导向的应用程序中明智地使用。

关于c# - 如何正确使用SerialPort.DiscardInBuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4011236/

相关文章:

C# 4.0 隐式类型动态对象

接口(interface)/基类中的 C# 枚举?

c# - Client Generated 不向第三方提供有关已知类型的信息

.net - 为什么ContinueWith传Task作为参数

c# - 始终以管理员身份运行使用 Windows 桌面桥转换的应用程序?

c# - 使用缓存机制进行节流有问题吗?

c# - 极其模糊的异常

linux - 检查用 O_NONBLOCK 打开的文件描述符是否已准备好

ruby-serialport 仅在串行监视器打开或 IRB 保持打开状态时发送数据

c - 在 Linux 中用 C 语言读取 RS232 串行引脚