COMMTIMEOUTS.ReadIntervalTimeout理解请教

辉歌 2013-07-12 06:38:24
COMMTIMEOUTS:COMMTIMEOUTS主要用于串口超时参数设置。COMMTIMEOUTS结构如下:

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


  ReadIntervalTimeout:两字符之间最大的延时,当读取串口数据时,一旦两个字符传输的时间差超过该时间,读取函数将返回现有的数据。设置为0表示该参数不起作用。指定时间最大值(毫秒),充许接收的2个字节间有时间差。也就 是说,刚接收了一个字节后,等了ReadIntervalTimeout时间后还没有新的字节到达,就 认为本次读串口操作结束(后面的字节等下一次读取操作来处理)。即使你想读8个字节,但读第2个字节后,过了ReadIntervalTimeout时间后,第3个字节还没到。实际上就只读了2个字节。


  ReadTotalTimeoutMultiplier:指定比例因子(毫秒),实际上是设置读取一个字节和等待下一个字节所需的时间,这样总的超时时间为读取的字节数乘以该值,同样一次读取操作到达这个时间后,也认为本次读操作己经结束。

  ReadTotalTimeoutConstant:一次读取串口数据的固定超时。所以在一次读取串口的操作中,其超时为ReadTotalTimeoutMultiplier乘以读取的字节数再加上 ReadTotalTimeoutConstant。将ReadIntervalTimeout设置为MAXDWORD,并将ReadTotalTimeoutMultiplier 和ReadTotalTimeoutConstant设置为0,表示读取操作将立即返回存放在输入缓冲区的字符。可以理解为一个修正时间,实际上就是按ReadTotalTimeoutMultiplier计算出的超时时间再加上该时间才作为整个超时时间。


一般都会做以下设置:
TimeOuts.ReadIntervalTimeout=MAXDWORD;
// 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
====================
我对ReadIntervalTimeout设置为MAXDWORD,把总超时设为0将导致ReadFile立即返回并完成操作不能理解。
设置为MAXDWORD,则超时时间将无限大,也就是两个字符间隔时间可以无限大,也就是收到了一个字节后,可以无限等待下一个字节到来。这应该是一直等待下去的,为什么说是立即返回呢?
这个立即返回,应该是总超时设置为0的原因吧?

如果将间隔超时设置MAXDWORD,总超时设置为3000ms,是否是等待3000ms就返回?
...全文
1573 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
申请不容1 2015-05-15
  • 打赏
  • 举报
回复
引用 7 楼 lyy365030998 的回复:
虽然过去很久了 ,但是我还是想知道 DWORD ReadIntervalTimeout; DWORD ReadTotalTimeoutMultiplier; 这两个的区别是什么呢 ReadTotalTimeoutMultiplier 只对总时间起作用吗 ??
//间隔超时=ReadIntervalTimeout // 总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstant 其他参见6楼
mihu525 2015-05-11
  • 打赏
  • 举报
回复
虽然过去很久了 ,但是我还是想知道 DWORD ReadIntervalTimeout; DWORD ReadTotalTimeoutMultiplier; 这两个的区别是什么呢 ReadTotalTimeoutMultiplier 只对总时间起作用吗 ??
s877272320 2014-10-07
  • 打赏
  • 举报
回复
串口读取事件分为两个阶段(我以Win32 API函数ReadFile读取串口过程来说明一下) 第一个阶段是:串口执行到ReadFile()函数时,串口还没有开始传输数据,所以串口缓冲区的第一个字节是没有装数据的,这时候总超时起作用,如果在总超时时间内没有进行串口数据的传输,ReadFile()函数就返回,当然 没有读取到任何数据。而且,间隔超时并没有起作用。 第二阶段:假设总超时为20秒,程序运行到ReadFile(),总超时开始从0 计时,如果在计时到达10秒时,串口开始了数据的传输,那么从接收的第一个字节开始,间隔超时就开始计时,假如间隔超时为1ms,那么在读取完第一个字节后,串口开始等待1ms,如果1ms之内接收到了第二个字节,就读取第二个字节,间隔超时重置为0并计时,等待第三个字节的到来,如果第三个字节到来的时间超过了1ms,那么ReadFile()函数立即返回,这时候总超时计时是没到20秒的。如果在20秒总计时时间结束之前,所有的数据都遵守数据间隔为1ms的约定并陆陆续续的到达串口缓冲区,那么就成功进行了一次串口传输和读取;如果20秒总计时时间到,串口还陆陆续续的有数据到达,即使遵守字节间隔为1ms的约定,ReadFile()函数也会立即返回,这时候总超时就起作用了。 总结起来,总超时在两种情况下起作用 第一:串口没进行数据传输,等待总超时时间那么长ReadFile()才返回。非正常数据传输 第二:数据太长,总超时设置太短,数据还没读取完就返回了。读取的数据是不全的 间隔超时触发是有条件的 第一:在总超时时间内。 第二:串口进行了数据的传输。 成功的进行一次串口数据的传输和读取,只有总超时和间隔超时相互参与配合才能完成
辉歌 2013-07-15
  • 打赏
  • 举报
回复
经过试验,结论如下: 当指定读取的字节长度没有满足,就开始等待,时间为 =长度*ReadTotalTimeoutMultiplier+ReadTotalTimeoutConstant。 总超时时间到,无论是否继续有数据来,都应该返回。 在等待总超时时间期间,间隔超时也将起作用。如果两个字节间隔时间超过了ReadIntervalTimeout,则也将返回。 所以有两个超时,一个是总超时,一个是间隔超时,只要任何一个超时,都将返回。
辉歌 2013-07-14
  • 打赏
  • 举报
回复
谢谢版主回复。 可能出现的场景 1.发出read操作时,接受缓冲区没有数据 继续可能的情况: 1.1间隔n时收到一个字节。 1.2间隔n时未收到字节。 2.发出read操作时,接受缓冲区有数据 继续可能的情况: 2.1间隔n时收到一个字节。 2.2间隔n时未收到字节。 所以关于超时,组合情况比较多,msdn也说的不清不楚的,得自己做试验了。
一条晚起的虫 2013-07-14
  • 打赏
  • 举报
回复
// 没有数据时,只有总超时起作用 // 当接收到数据后,字节间超时就超时返回了。
一条晚起的虫 2013-07-13
  • 打赏
  • 举报
回复
// 如果将间隔超时设置MAXDWORD,总超时设置为3000ms,是否是等待3000ms就返回? // 未读到需要的数据情况下,是这样的。
一条晚起的虫 2013-07-13
  • 打赏
  • 举报
回复
// 总超时时间满足的情况下,才涉及字符间超时

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧