使用SerialDataReceivedEventHandler可以知道何时发生超时

本文关键字:何时发 超时 SerialDataReceivedEventHandler 使用 | 更新日期: 2023-09-27 18:29:56

我使用SerialDataReceivedEventHandler来知道我的SerialPort对象何时接收数据。

有可能知道我什么时候不会因为字节间超时而不再接收数据吗?

使用SerialDataReceivedEventHandler可以知道何时发生超时

否,只有当您调用Read()并且没有要读取的数据时,才会引发TimeoutException。DataReceived事件在有可用数据时触发,因此Read()调用永远不会引发该异常。

一个简单的解决方法是使用您自己的定时器。在事件处理程序中调用其Stop()和Start()方法来重置计时器。并在其Tick事件触发时声明失败。

简单的答案是你可以,但你不应该

没有内在的方法可以做到这一点。但是,您可以在SerialDataReceivedEventHandler中设置一个计时器(如Hans-mentionned),并在每次接收字符时重置此计时器。如果计时器过期,您可以发现您可能不再接收数据。

话虽如此,串行通信也有其怪癖。定时器到期的事实并不意味着另一个系统已经结束了数据传输。中间可能有一些流量控制机制,让一个系统等待另一个系统,一端或另一端可能会有一些延迟。(如果您的系统正忙,它可能会在触发事件之前缓冲串行数据)

通常,传输结束是在接收到某个特定字符时确定的(通常是CR/LF),这比等待指定的超时

要稳健得多