我编写了一个应用程序,它以非常快的速度从串行设备读取数据。然而,串行端口对象无法触发收到数据 https://learn.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.datareceived连续运行约 20 分钟后发生事件。以编程方式断开并重新连接串行允许事件再次运行,但仅持续 20 分钟。
我尝试使用丢弃缓冲区 https://learn.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.discardinbuffer每次之后收到数据 https://learn.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.datareceived事件,这似乎已经解决了问题。但该方法会消耗大量 cpu 时间并降低应用程序的性能。 MSDN 提到该方法“丢弃串行驱动程序接收缓冲区中的数据。”,但没有建议何时使用该方法。
何时以及如何应该丢弃缓冲区 https://learn.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.discardinbuffer被使用,我是否在正确的上下文中使用它来解决我的特定问题?
Edit:
实施后收到错误 https://learn.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.errorreceived事件,返回的事件数据表明事件类型是RXOver https://learn.microsoft.com/en-us/dotnet/api/system.io.ports.serialerror.
经过更多调查后,看来我的问题是一个更根本的问题。由于数据快速涌入,因此需要连续清除或处理串行端口缓冲区以防止“RXOver”错误。我通过在DataReceived
事件并在另一个单独的线程中处理它。
据我了解DiscardInBuffer
仅应有选择地用于出于初始化目的清除端口的内容,例如在打开端口之前。清除驱动程序缓冲区的过程确实需要一些时间才能完成,因此应在面向性能的应用程序中明智地使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)