原创 串口编程之二:超时COMMTIMEOUTS结构

2010-4-13 11:13 6499 10 17 分类: 消费电子

 

在WIN32  API编程中,除了DCB结构之外,还需要了解COMMTIMEOUTS结构.这个结构是为了读写串口的超时而设置的.

COMMTIMEOUTS结构如下:  
   
  typedef   struct   _COMMTIMEOUTS   {    
  DWORD   ReadIntervalTimeout;                 //任意相邻连个字符之间的超时设置
  DWORD   ReadTotalTimeoutMultiplier;        //读操作总的超时时间的系数
  DWORD   ReadTotalTimeoutConstant;       //读操作总的超时时间的修正常量
  DWORD   WriteTotalTimeoutMultiplier;       //写操作总的超时时间的系数
  DWORD   WriteTotalTimeoutConstant;       //写操作总的超时时间的修正常量
  }   COMMTIMEOUTS,*LPCOMMTIMEOUTS;     
      
    
    ReadIntervalTimeout:两相邻字符之间最大的延时。当读串口数据时,一旦两个字符传输的时间间隔超过该时间,读函数将返回现有的数据。设置为0表示该参数不起作用。    
   
    ReadTotalTimeoutMultiplier:读操作总的超时事件的系数。 这个变量是不能单独使用的。 必须和ReadTotalTimeoutConstant 一起使用才有效果。    
    
    ReadTotalTimeoutConstant:读操作总的超时时间的修正常量。 这个变量也是不能单独使用的。必须和ReadTotalTimeoutMultiplier一起使用才有效果。 
    
    WriteTotalTimeoutMultiplier:写操作总的超时事件的系数。 这个变量是不能单独使用的。 必须和WriteTotalTimeoutConstant 一起使用才有效果。   
    
    WriteTotalTimeoutConstant:写操作总的超时时间的修正常量。 这个变量也是不能单独使用的。必须和WriteTotalTimeoutMultiplier一起使用才有效果。

       在整个串口的读写操作中, 存在着两种超时设置。一种是间隔超时, 一种是总超时。 这两种超时是独立存在,互不影响的。 

      间隔超时, 只在读操作中存在。就是ReadIntervalTimeout。 当读操作中,前后两个字符之间的时间间隔超过时,读操作就结束了。举例来说,你一次读取8个字符,但是在你读取了第一个字符之后,在读取第二个字符时,间隔超时了,那么读操作就结束了, 这样整个操作就只读取了1个字节。 即使, 你的总时间没有超时。 

       另一种超时,就是总超时。 这里有一个公式。
       总的读/写超时时间 = Read(Write)TotalTimeoutMultiplier x 要读/写的字节数 + Read(Write)TotalTimeoutConstant. 
       这里要说明的一点,要读/写的字节数是从哪里来的。 这个是从ReadFile 或者WriteFile 函数中定义的。
       在读操作时, 若当前所花读取时间已经超过了总的超时设置, 则读操作就结束了。即使, 每两个字符之间的间隔没有超时。 举例来说, 若总共读取8个字节。 间隔设置为8ms, 总超时系数为3ms,总超时常数为3ms。 则总的超时时间为3*8+3=27ms。若每个字符读取的间隔为7ms, 则这次操作总共能读取4个字符。 就结束了。因为读取第5个字符时, 已经需要35ms, 超过总超时时间了。

下面来讨论一下这几个参数的设定:
将ReadIntervalTimeout设置为MAXDWORD,将ReadTotalTimeoutMultiplier   和ReadTotalTimeoutConstant设置为0,表示读操作将立即返回存放在输入缓冲区的字符。  

将ReadIntervalTimeout设置为MAXDWORD,将ReadTotalTimeoutMultiplier   和ReadTotalTimeoutConstant设置为MAXDWORD, 表示读操作会一直等待直到所需要读取的字节数全部接收到为止。 (大家可以把MAXDWORD 认为是永远)

将ReadIntervalTimeout设置为0, 则不使用间隔超时, 只考虑总超时设置。

文章评论7条评论)

登录后参与讨论

用户1406868 2013-1-24 19:37

I didn't know where to find this info then kboaom it was here.

用户1406868 2012-11-6 16:57

能够无赏地分享知识,使人受惠,善莫大焉!

用户1249549 2010-11-1 09:34

hao

用户1277994 2010-4-13 11:14

博主, 我看到了,我将标题和链接加至文章中了。

用户1398176 2010-4-12 21:25

<串口编程之一> 有发出来. 在前面.

用户1277994 2010-4-12 15:32

博主,是不是《串口编程之一》没有发出来?

用户1277994 2010-4-12 15:31

很好的技术文章。
相关推荐阅读
用户1398176 2013-05-09 17:23
串口编程之五:常用函数
在进行串口通信时,经常需要用到下列一些API函数: CreateFile():用于打开一个文件访问串口; GetCommState():获取串口的当前配置,放入DCB中; SetCom...
用户1398176 2013-05-09 16:55
串口编程之三:COMSTAT 结构
COMSTAT结构 COMSTAT结构包含串口的信息,结构定义如下: typedef struct _COMSTAT { // cst     DWORD fCtsHold : 1;   /...
用户1398176 2013-05-09 15:47
转载至MSDN: CE_OVERRUN
  CE_OVERRUN Errors with Serial Communications   *******> The communications driver (...
用户1398176 2013-05-09 14:49
串口编程之一: WIN32 API 中串口DCB 结构的介绍
在应用WIN32  API 对串口进行编程时, 必定会使用到DCB 结构. 下面的DCB 结构的一些介绍. 首先是DCB 结构. typedef struct _DCB {          ...
用户1398176 2012-04-05 18:37
6西格玛
今天碰到一些缩写, 不清楚什么意思, 上网查了查,是6西格玛的。 记录下来, 免得以后忘了。 OOB: out of box,  开箱检查.             在产线完工后,出货前,作...
用户1398176 2010-11-07 19:32
签入(check in) 与 签出(check out)
        在一个团队共同合作完成一个项目时, 很多文件是大家共享, 且具有修改权限的。 而一般如果你在修改某一个文件的时候, 在没有修改完成之前, 你是不希望别人也在这个时候修改这个文件的.  ...
EE直播间
更多
我要评论
7
10
关闭 站长推荐上一条 /6 下一条