解决串口通讯中部分串口ReadFile使用SetCommTimeouts设置超时无效的问题

在串口通讯中(笔者系统为32位win7),为简单起见,经常采用同步方式读取串口数据。即调用CreateFile函数打开串口时,不设置其倒数第二个参数为FILE_FLAG_OVERLAPPED。

      此时,一般需要设置ReadFile读取数据的超时时间,或者直接设置其不论是否读取到数据,都立即返回。否则,可能由于ReadFile无限期等待读取数据而造成线程阻塞。

      设置串口读取和写入的超时时间,采用函数SetCommTimeouts。但笔者发现,有些串口设置读取超时时间后,在ReadFile时仍然会无限期等待,似乎没有起作用。

      查找本机注册表,发现串口列表集中在HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/SERIALCOMM键中。所有无法设置超时时间的串口其键名最后部分都包含“VCOM”。在笔者的电脑中,这些串口都不是实际串口,也不是笔者要操作的串口,故将其从注册表中删除。此后,遍历串口时将不会得到这些串口名,这样就将所有无法设置超时时间的串口都过滤掉了。

      读者实际使用时,也可以根据注册表键名是否包含“VCOM”过滤掉这些串口,而不直接在注册表中删除键值。

备注:在Windows 2000操作系统中,笔者发现采用同步方式打开HID设备后,无法通过SetCommTimeouts设置ReadFile的超时时间。此时就只有通过异步方式读取进行超时控制了。

转:http://blog.csdn.net/whvovi/article/details/6202076

你可能感兴趣的:(解决串口通讯中部分串口ReadFile使用SetCommTimeouts设置超时无效的问题)