解决串口通讯中部分串口ReadFile使用SetCommTimeouts设置超时无效的问题
2014-10-11 17:10
627 查看
在串口通讯中(笔者系统为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读取数据的超时时间,或者直接设置其不论是否读取到数据,都立即返回。否则,可能由于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设置超时无效的问题
- DBMS_SESSION.SET_CONTEXT的使用及无效权限问题的解决
- 使用OWC 做图表时按周、月、年设置时间刻度是参数无效问题解决方法
- VS2005下使用VC,部分断点无效问题解决方法
- iOS开发解决:iOS8.1中UIBarButtonItem的setTitleTextAttributes对Disabled颜色设置无效问题
- 关于redis使用set时设置超时时间的问题
- 使用font-awesome图标,css元素选择器(i)下,部分设置不生效的问题之解决。
- DBMS_SESSION.SET_CONTEXT的使用及无效权限问题的解决
- Android中xml布局文件中使用include引入布局进行复用(解决使用include布局重叠,颜色设置无效问题)
- iOS 中TextKit的使用中,设置部分字体,出现的问题及解决方法
- libcurl使用easy模式阻塞卡死等问题的完美解决---超时设置
- libcurl使用easy模式阻塞卡死等问题的完美解决---超时设置
- 解决listview中的textview设置了setMovementMethod导致onItemclick无效的问题
- linux下Oracle通过设置大内存页解决使用swap分区问题
- linux下Oracle通过设置大内存页解决使用swap分区问题
- MAC Leopard 部分设置不能使用的解决办法
- MyEclipse6.0 代码提示快键健设置无效问题解决
- 解决IE6下div层设置高度1px无效的问题
- set Autotrace使用的问题与解决
- 解决使用HttpWebRequest时总是提示登陆超时的问题