用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代表总读取总超时时间无效(读取所有字节的时间为ReadTotalTimeoutMultiplier*BytesToRead+ReadTotalTimeoutConstant)。
- WriteTotalTimeoutMultiplier
- 乘数用来计算写操作的总超时周期,按毫秒计算。对每个写操作,这个值将乘以要写入的字节数。(写单个字符的最大超时)
- WriteTotalTimeoutConstant
- 一个用于计算写入操作的总超时周期的常数,按毫秒计算。对于每一次写入操作,实际总超时时间为WriteTotalTimeoutMultiplier 成员与要写入字节的乘积再加此值.
WriteTotalTimeoutMultiplier和WriteTotalTimeoutConstant成员为0代表总写入时间无效(写入所有字节的时间为WriteTotalTimeoutMultiplier*BytesToWrite+WriteTotalTimeoutConstant)。
备注
如果一个应用程序设置ReadIntervalTimeout和ReadTotalTimeoutMultiplier为 MAXDWORD并且设置ReadTotalTimeoutConstant 为一个大于零且小于MAXDWORD的值, 在调用ReadFile时将会发生如下现象:
- 如果在输入缓冲区中有任何字符,ReadFile 立即返回缓冲区中的内容。
- 如果在缓冲区中没有任何字符,ReadFile 将等待接收到一个字符并立即返回.
- 如果在ReadTotalTimeoutConstant指定的时间值内无任何字节返回,ReadFile超时.