我编写了一个以非常快的速度从串行设备读取数据的应用程序。然而,串行端口对象在连续运行约 20 分钟后未能触发 DataReceieved
事件。以编程方式断开和重新连接串行允许事件再次工作,但仅再持续 20 分钟。
我尝试在每次 DataReceived
事件后使用 DiscardInBuffer
,这似乎已经解决了问题。但该方法会消耗大量 CPU 时间,并且会降低应用程序的性能。 MSDN 提到方法“丢弃串行驱动程序的接收缓冲区中的数据。”,但没有建议何时使用它。
应该何时以及如何使用 DiscardInBuffer
,我是否在针对我的特定问题的正确上下文中使用它?
编辑:
实现ErrorReceived
事件后,返回的事件数据表明事件类型为“RXOver”。
最佳答案
经过更多调查,我的问题似乎更像是一个基本问题。由于数据以极快的速度涌入,因此需要连续清除或处理 SerialPort 缓冲区,以防止出现“RXOver”错误。我通过在 DataReceived
事件期间读入另一个缓冲区并在另一个单独的线程中处理它来实现这一点。
根据我的理解,DiscardInBuffer
应该只选择性地用于清除端口的内容以进行初始化,例如在打开端口之前。清除驱动程序缓冲区的过程确实需要一些时间才能完成,因此应该在以性能为导向的应用程序中明智地使用。
关于c# - 如何正确使用SerialPort.DiscardInBuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4011236/