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

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

 
  用COMMTIMEOUTS结构可以规定读/写操作的超时,该结构的定义为:
 
  typedef struct _COMMTIMEOUTS {
 
  DWORD ReadIntervalTimeout; // 读间隔超时。  接收时,两字符间最大的时延。
 
  DWORD ReadTotalTimeoutMultiplier; // 读时间系数。  读取每字节的超时。
 
  DWORD ReadTotalTimeoutConstant; // 读时间常量。  读串口数据的固定超时。
               //  总超时   =   ReadTotalTimeoutMultiplier   *   字节数   +   ReadTotalTimeoutConstant   
 
  DWORD WriteTotalTimeoutMultiplier; // 写时间系数。  写每字节的超时。
 
  DWORD WriteTotalTimeoutConstant; // 写时间常量。  写串口数据的固定超时。
                //   总超时   =       WriteTotalTimeoutMultiplier   *   字节数   +       WriteTotalTimeoutConstant  
 
  } COMMTIMEOUTS,*LPCOMMTIMEOUTS;
 
COMMTIMEOUTS   comTimeOut;    //   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/scorpions/archive/2013/01/07/2848741.html

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值