读串口时COMMTIMEOUTS结构的迷惑.

GDI_GTK 2007-03-05 10:07:46
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=50; //什么含义?
TimeOuts.ReadTotalTimeoutMultiplier=0; //什么含义?
TimeOuts.ReadTotalTimeoutConstant=0; //什么含义?
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=0;
TimeOuts.WriteTotalTimeoutConstant=0;
b = SetCommTimeouts(mhCom,&TimeOuts); //设置超时
我测试结果: 如果ReadFile时指定的长度比较大时,GetOverlappedResult要等一会才能返回,较小时很明显返回快些,怎么设置才能满足:
不管大小,只要有数据就能很快返回?
...全文
1573 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cgqn007 2012-10-30
  • 打赏
  • 举报
回复
我也想知道楼上问的问题
sxhybob 2008-04-10
  • 打赏
  • 举报
回复
1 :ReadFile “操作完毕“ 和 “返回“ 的 区别 ?
2 :如果ReadIntervalTimeout为0,则该值不起作用,不起作用什么意思,对ReadFile有什么影响?
3 :如果 WriteTotalTimeoutMultiplier 和 WriteTotalTimeoutConstant都为0,则在写操作时忽略总超时数,忽略是什么意思?对writefile 有什么影响?
yyz_1112 2008-03-19
  • 打赏
  • 举报
回复
为什么ReadIntervalTimeout要设置为3,难道不应该和波特率有关吗?例如:
9600bps,接收一字节需要10/9600*1000=1.04ms,ReadIntervalTimeout 设置为2;
4800bps,接收一字节需要2.08ms,ReadIntervalTimeout 设置为3。
这样理解对吗?
tiger波波 2007-03-05
  • 打赏
  • 举报
回复
// COMMTIMEOUTS对象
COMMTIMEOUTS comTimeOut;

// 接收时,两字符间最大的时延
comTimeOut.ReadIntervalTimeout = 3;

// 读取每字节的超时
comTimeOut.ReadTotalTimeoutMultiplier = 3;

// 读串口数据的固定超时
// 总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstant
comTimeOut.ReadTotalTimeoutConstant = 2;

// 写每字节的超时
comTimeOut.WriteTotalTimeoutMultiplier = 3;

// 写串口数据的固定超时
comTimeOut.WriteTotalTimeoutConstant = 2;

// 将超时参数写入设备控制
SetCommTimeouts(handlePort_,&comTimeOut);
ReadIntervalTimeout

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

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

ReadTotalTimeoutMultiplier

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

ReadTotalTimeoutConstant

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

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

WriteTotalTimeoutMultiplier

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

WriteTotalTimeoutConstant

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

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

提示:用户设置通讯超时后,如没有出错,串口已经被打开。
esprite2000 2007-03-05
  • 打赏
  • 举报
回复
你的串口是以OVERLAPPED方式打开的吗?这种方式按理应该是没有延迟的

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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