源:串口通信中ReadFile和WriteFile的超时详解!

在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。 有两种超时:间隔超时和总超时。间隔超时是指在接收时两个字符之间的最大时延,总超时是指读写操作总共花费的最大时间。写操作只支持总超时,而读操作两种超时均支持。

  用COMMTIMEOUTS结构可以规定读/写操作的超时,该结构的定义为:

typedef struct _COMMTIMEOUTS {DWORD ReadIntervalTimeout;        // 读间隔超时。 接收时,两字符间最大的时延。DWORD ReadTotalTimeoutMultiplier; // 读时间系数。 读取每字节的超时。DWORD ReadTotalTimeoutConstant;   // 读时间常量。 读串口数据的固定超时。// 总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstantDWORD WriteTotalTimeoutMultiplier;// 写时间系数。 写每字节的超时。DWORD WriteTotalTimeoutConstant;  // 写时间常量。 写串口数据的固定超时。// 总超时 = WriteTotalTimeoutMultiplier * 字节数 + WriteTotalTimeoutConstant
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;COMMTIMEOUTS//COMMTIMEOUTS对象
SetCommTimeouts(handlePort_,&comTimeOut);//;将超时参数写入设备控制

ReadIntervalTimeout:

  指定通讯线上两个字符到达的最大时延,以毫秒为单位。在ReadFile操作期间,时间周期从第一个字符接收到算起。如果收到的两个字符之间的间隔超过该值,ReadFile操作完毕并返回所有缓冲数据。如果ReadIntervalTimeout为0,则该值不起作用。

  如果值为MAXDWORD,   并且ReadTotalTimeoutConstant和ReadTotalTimeoutMultiplier两个值都为0,   则指定读操作携带已经收到的字符立即返回,即使没有收到任何字符。

ReadTotalTimeoutMultiplier:

  指定以毫秒为单位的累积值。用于计算读操作时的超时总数。对于每次读操作,该值与所要读的字节数相乘。

ReadTotalTimeoutConstant : 

  指定以毫秒为单位的常数。用于计算读操作时的超时总数。对于每次读操作,ReadTotalTimeoutMultiplier与所要读的字节数相乘后与该值相加。

如果ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都为0,则在读操作时忽略总超时数。

WriteTotalTimeoutMultiplier:

  指定以毫秒为单位的累积值。用于计算写操作时的超时总数。对于每次写操作,该值与所要写的字节数相乘。

WriteTotalTimeoutConstant:

  指定以毫秒为单位的常数。用于计算写操作时的超时总数。对于每次写操作,WriteTotalTimeoutMultiplier与所要写的字节数相乘后与该值相加。

如果WriteTotalTimeoutMultiplier和WriteTotalTimeoutConstant都为0,则在写操作时忽略总超时数。

提示:用户设置通讯超时后,如没有出错,串口已经被打开。

  COMMTIMEOUTS结构的成员都以毫秒为单位。   

  总超时的计算公式是:   

  总超时 = 时间系数 × 要求读/写的字符数 + 时间常量   

  例如,如果要读入10个字符,那么读操作的总超时的计算公式为:   

  读总超时 = ReadTotalTimeoutMultiplier × 10 + ReadTotalTimeoutConstant   

  可以看出,间隔超时和总超时的设置是不相关的,这可以方便通信程序灵活地设置各种超时。如果所有写超时参数均为0,那么就不使用写超时。如果ReadIntervalTimeout为0,那么就不使用读间隔超时,如果ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都为0,则不使用读总超时。如果读间隔超时被设置成MAXDWORD并且两个读总超时为0,那么在读一次输入缓冲区中的内容后读操作就立即完成,而不管是否读入了要求的字符。 在用重叠方式读写串行口时,虽然ReadFile和WriteFile在完成操作以前就可能返回,但超时仍然是起作用的。在这种情况下,超时规定的是操作的完成时间,而不是ReadFile和WriteFile的返回时间。

转载于:https://www.cnblogs.com/LittleTiger/p/4390219.html

串口通信中ReadFile和WriteFile的超时详解!相关推荐

  1. PLC通信中的IP地址和子网掩码详解

    PLC通信中的IP地址和子网掩码详解 IP地址是我们在网际层进行数据传输时一种逻辑编址. IPV4协议中,是使用4个字节来进行标识的,每个字节以10进制数进行表示. 主要包含两大类:网络地址和主机地址 ...

  2. STM32串口通信中使用printf发送数据配置方法 开发环境 Keil

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 已有 12456 次阅读2011-6-29 23:29 | 在STM32串口通信程序中使用printf发送数据, ...

  3. Arduino中Serial.print()与Serial.write()函数的区别,以及串口通信中十六进制与字符串的收发格式问题和转换过程详解

    1.串口通信中十六进制和字符数据的区别 串口收发数据时字符.十六进制.二进制格式详细区分 ASCII码查询表格 在使用串口发送数据时可以选择字符串(ASCII)发送或者十六进制(Hex)发送,通常情况 ...

  4. xmodem java_Xmodem XMODEM协议是一种串口通信中广泛用到的异步文件传输协议 联合开发网 - pudn.com...

    Xmodem 所属分类:串口编程 开发工具:Java 文件大小:3KB 下载次数:6 上传日期:2017-11-02 21:50:52 上 传 者:雄霸天下19 说明:  XMODEM协议是一种串口通 ...

  5. SPCOMM控件在Delphi7.0串口通信中的应用

    ====================================================== 注:本文源代码点此下载 ================================= ...

  6. C#解决串口通信中接收数据时延迟处理与缓存处理的方法

    转载连接: http://blog.csdn.net/yaoliang11/article/details/6885768 C#解决串口通信中接收数据时延迟处理与缓存处理的方法 时间:2011-1-2 ...

  7. 教程-Delphi中Spcomm使用属性及用法详解

    Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选 ...

  8. 通过串口来控制网管型交换机的操作步骤详解

    之前我们对网管型交换机的三种管理方式简单的给大家介绍了一下,一.通过串口管理:二.通过web管理:三.通过网管软件管理.今天,飞畅科技的小编来为大家详细介绍下通过串口终端配置是如何对网管交换机进行控制 ...

  9. Vue通信、传值的多种方式,详解

    Vue通信.传值的多种方式,详解 转自:https://blog.csdn.net/qq_35430000/article/details/79291287 一.通过路由带参数进行传值 ①两个组件 A ...

最新文章

  1. docker process tree
  2. python详细基础教程-Python基础教程,Python入门教程(非常详细)
  3. Win64 驱动内核编程-24.64位驱动里内嵌汇编
  4. mysql修改最大文件数_mysql更改最大打開文件數
  5. Objective-C 2.0 with Cocoa Foundation--- 8,类方法以及私有方法
  6. Cassandra数据读取机制
  7. hello 51CTO
  8. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
  9. Windows YII2安装
  10. 理解vue中的组件(二)
  11. ASMSupport教程4.7 生成关系运算符
  12. attachEvent中this指向(转)
  13. 基本入门的C/C++算法总结
  14. 《算法笔记》胡凡 配套刷题网站
  15. 有人能帮忙下载下吗 新手没积分 感激不尽
  16. 小米校招产品作业解读:设计一款日记APP
  17. 基于C#(Visual Studio 2013)的AutoCAD2016二次开发(二)创建直线
  18. c语言程序实现索引查找,索引查找之英语词典(C语言实现)
  19. numpy.linalg 中的逆矩阵 inv
  20. 文档控件Aspose.words for.java 授权须知

热门文章

  1. python重复字符串n次的函数_LeetCode_Python(3)_无重复字符的最长子串
  2. 我的教师生涯4:被忘却的第一节课
  3. RenderTransformOrigin 的作用
  4. 计算一棵树的深度和宽度[Treeview的深度和宽度](多题头的表格问题解决的基础)...
  5. GDAL中的SURF算法
  6. Arcgis Javascript那些事儿(十)--发布网络分析服务
  7. [知乎] 端游、手游服务端架构演变
  8. FlashDevelop专用swc导出插件
  9. 深入理解kafka_深入理解Kafka随书代码示例已整理完毕,附地址~
  10. shell脚本中判断大于、小于、等于、不等于的符号