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

时间:2012-04-03 13:18:41

标签: c# serial-port

我正在使用SerialDataReceivedEventHandler知道我的SerialPort对象何时收到数据。

是否有可能知道我何时不再接收数据,因为发生了字节间超时?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

简短的回答是 ,但 不应该

没有内置的方法。但是,您可以在SerialDataReceivedEventHandler中设置一个计时器(如Hans提到的),并在每次收到字符时重置此计时器。如果计时器到期,您可以确定您可能没有收到任何数据。

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

通常,在收到某些特定字符(通常为CR / LF)时确定传输结束,这比等待指定的超时要强得多

相关问题