COMMTIMEOUTS:COMMTIMEOUTS主要用于串口超时参数设置。COMMTIMEOUTS结构如下:

typedef struct _COMMTIMEOUTS { 
DWORD ReadIntervalTimeout; 
DWORD ReadTotalTimeoutMultiplier; 
DWORD ReadTotalTimeoutConstant; 
DWORD WriteTotalTimeoutMultiplier; 
DWORD WriteTotalTimeoutConstant; 
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

间隔超时=ReadIntervalTimeout
总超时   =   ReadTotalTimeoutMultiplier   * 字节数   +   ReadTotalTimeoutConstant

串口读取事件分为两个阶段(我以Win32 API函数ReadFile读取串口过程来说明一下)
第一个阶段是:串口执行到ReadFile()函数时,串口还没有开始传输数据,所以串口缓冲区的第一个字节是没有装数据的,这时候总超时起作用,如果在总超时时间内没有进行串口数据的传输,ReadFile()函数就返回,当然 没有读取到任何数据。而且,间隔超时并没有起作用。
第二阶段:假设总超时为20秒,程序运行到ReadFile(),总超时开始从0 计时,如果在计时到达10秒时,串口开始了数据的传输,那么从接收的第一个字节开始,间隔超时就开始计时,假如间隔超时为1ms,那么在读取完第一个字节后,串口开始等待1ms,如果1ms之内接收到了第二个字节,就读取第二个字节,间隔超时重置为0并计时,等待第三个字节的到来,如果第三个字节到来的时间超过了1ms,那么ReadFile()函数立即返回,这时候总超时计时是没到20秒的。如果在20秒总计时时间结束之前,所有的数据都遵守数据间隔为1ms的约定并陆陆续续的到达串口缓冲区,那么就成功进行了一次串口传输和读取;如果20秒总计时时间到,串口还陆陆续续的有数据到达,即使遵守字节间隔为1ms的约定,ReadFile()函数也会立即返回,这时候总超时就起作用了。
总结起来,总超时在两种情况下起作用
第一:串口没进行数据传输,等待总超时时间那么长ReadFile()才返回。非正常数据传输
第二:数据太长,总超时设置太短,数据还没读取完就返回了。读取的数据是不全的
间隔超时触发是有条件的
第一:在总超时时间内。
第二:串口进行了数据的传输。
成功的进行一次串口数据的传输和读取,只有总超时和间隔超时相互参与配合才能完成

最新文章

  1. 信息系统实践手记5-CACHE设计一例
  2. [LeetCode] Read N Characters Given Read4 II - Call multiple times 用Read4来读取N个字符之二 - 多次调用
  3. Service服务
  4. 【一周读书】All life is problem solving
  5. Cmap的使用
  6. javascript------>(此文转发)
  7. 论文笔记之:Instance-aware Semantic Segmentation via Multi-task Network Cascades
  8. 关于 UGUI 字体花屏或乱码。
  9. hdu4099
  10. extjs在form表单提交成功、故障响应信息
  11. linux下一个php未找到php型材php.ini解决方案
  12. crm创建和编辑全局选项集
  13. javascript语句语义大全(2)
  14. VS2013 opencv2.4.8
  15. ThinkPHP 5 中AJAX跨域请求头设置方法
  16. Java基础--二进制运算
  17. ASP.NET MVC5入门1之项目创建
  18. .Net转Java.04.踩到switch的坑
  19. IP地址查询接口API
  20. 使用pm2管理node.js应用

热门文章

  1. php常见安全问题
  2. python 面试题: 列表表达式
  3. gdb coredum 信息例子
  4. 一个android控件资源网站
  5. C#数据库连接问题
  6. JQuery实现的智能表单提示
  7. tomcat 路径"/"表示根目录
  8. 【bzoj2006】[NOI2010]超级钢琴 倍增RMQ+STL-堆
  9. JQuery排错关于$(document).ready(function(){});
  10. 关于HTML中的object元素