串口通讯超时的设置与含义(COMMTIMEOUTS)
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()才返回。非正常数据传输
第二:数据太长,总超时设置太短,数据还没读取完就返回了。读取的数据是不全的
间隔超时触发是有条件的
第一:在总超时时间内。
第二:串口进行了数据的传输。
成功的进行一次串口数据的传输和读取,只有总超时和间隔超时相互参与配合才能完成
最新文章
- 信息系统实践手记5-CACHE设计一例
- [LeetCode] Read N Characters Given Read4 II - Call multiple times 用Read4来读取N个字符之二 - 多次调用
- Service服务
- 【一周读书】All life is problem solving
- Cmap的使用
- javascript------>;(此文转发)
- 论文笔记之:Instance-aware Semantic Segmentation via Multi-task Network Cascades
- 关于 UGUI 字体花屏或乱码。
- hdu4099
- extjs在form表单提交成功、故障响应信息
- linux下一个php未找到php型材php.ini解决方案
- crm创建和编辑全局选项集
- javascript语句语义大全(2)
- VS2013 opencv2.4.8
- ThinkPHP 5 中AJAX跨域请求头设置方法
- Java基础--二进制运算
- ASP.NET MVC5入门1之项目创建
- .Net转Java.04.踩到switch的坑
- IP地址查询接口API
- 使用pm2管理node.js应用
热门文章
- php常见安全问题
- python 面试题: 列表表达式
- gdb coredum 信息例子
- 一个android控件资源网站
- C#数据库连接问题
- JQuery实现的智能表单提示
- tomcat 路径";/";表示根目录
- 【bzoj2006】[NOI2010]超级钢琴 倍增RMQ+STL-堆
- JQuery排错关于$(document).ready(function(){});
- 关于HTML中的object元素