日期:2014-05-17  浏览次数:20853 次

为什么串口的readtimeout属性没作用,微软BUG?
我一直以为readtimeout属性是像文档中说的那样,是设置读取超时的,可实际情况并不如此,简单建立以下代码:
serialport1.readtimeout=1000;
serialport1.open();
serialport1.readbyte();
按道理,1秒后,会发生TimeoutException异常,可实际上,程序到这里就阻塞了,如果放在界面线程执行的话,那就假死了,如果这个时候给它喂一个字节,它又活了,这表明程序在那里拼老命等了。
实在不知什么道理,希望哪位给出一个解释:
readtimeout到底有什么用?

------解决方案--------------------
从没留意过那个,因为一般都是打算无限等待的。你试过其它读取方法了没有,比如ReadLine等其它方法,如果都没用,估计就真没啥用了。
------解决方案--------------------
一直有用“ReadTimeout”和“WriteTimeout”,工作正常。

非要找serialport的不足是有的,但这个应该没问题。
------解决方案--------------------
ReadTimeOut的意思是从有数据开始,读取的时间超过这个设置的值,则引发异常,比如是某些驱动级原因导致读取时间过长导致的,并不是说ReadByte,ReadTo,ReadLine的超时时间,这些方法本身是一定会同步阻塞等结果的,你可以先判断一下,比如
if(serial.BytesToRead>0) b = serial.ReadByte();
或是用
serial.ReadExisting()
读取到一个缓存,再处理替代ReadLine或ReadTo。
替代都是发生在你的信源(对你程序的发送方)可能会正常情况的缺失\r\n或你指定字符的情况。
------解决方案--------------------
引用:
ReadTimeOut的意思是从有数据开始,读取的时间超过这个设置的值,则引发异常,比如是某些驱动级原因导致读取时间过长导致的,并不是说ReadByte,ReadTo,ReadLine的超时时间,这些方法本身是一定会同步阻塞等结果的,你可以先判断一下,比如
if(serial.BytesToRead>0) b = serial.ReadByte();
或是用
serial.ReadExis……


的确是这样,一般来说 readbyte 是放在线程中的,因为接收方不知道发送方何时会传输数据所以一直会读取,知道有数据来。