通信资源的句柄具有影响读写操作行为的相关的超时参数集。超时可能导致ReadFileEx,ReadFileEx,WriteFile或WriteFileEx操作结束超时间隔的时间,即使指定的字符数未被读取或写入。在读取或写入操作期间发生超时(即读取或写入功能的返回值表示成功)时,不会将其视为错误。实际读取或写入的字节数由ReadFile或WriteFile(或GetOverlappedResult或FileIOCompletionRoutine功能报告,如果I / O作为重叠操作执行)。
当应用程序打开通信资源时,操作系统将资源的超时值设置为上次使用资源时有效的值。如果通信资源从未打开,则操作系统将超时值设置为某个默认值。在任一情况下,应用程序应始终确定打开资源后的当前超时值,然后明确设置它们以满足其要求。要确定通信资源的当前超时值,请使用GetCommTimeouts功能。要更改超时值,请使用SetCommTimeouts功能。
通过超时参数启用两种类型的超时。当两个字符的接收时间超过指定的毫秒数时,发生间隔超时。当接收到第一个字符时,开始计时,并且在接收到每个新的字符时重新启动。当读取操作消耗的总时间超过计算出的毫秒数时,发生总超时。I / O操作开始时立即开始计时。写操作只支持超时。读操作支持间隔和总超时,可单独使用或组合使用。
通过使用GetCommTimeouts或SetCommTimeouts函数中指定的COMMTIMEOUTS结构中的乘数和常数值计算读或写操作的总超时周期的时间(以毫秒为单位)。使用以下公式:
Timeout = (MULTIPLIER * number_of_bytes) + CONSTANT
使用乘数和常数可使总超时周期变化,具体取决于请求的数据量。应用程序只能通过将乘数设置为零来使用常数,或者通过将常数设置为零仅使用乘数。如果常数和乘数均为零,则不使用总超时。
如果所有读取超时参数为零,则不会使用读取超时,并且只有在读取所请求的字节数或发生错误之后,读取操作才会完成。类似地,如果所有写入超时参数为零,则在所请求的字节数已写入或发生错误之前,写入操作不会完成。
如果读取间隔超时参数为MAXDWORD值,并且读取总超时参数都为零,则读取操作在读取输入缓冲区中可用的任何字符后立即完成,即使为空。这与以前版本的Windows中的ReadComm功能相同。
接收时间间隔时间强制读取操作返回。使用间隔超时的过程可以设置相当短的间隔参数,因此它可以快速响应一个或几个字符的小型,隔离的突发,但是当数据被接收时,它仍然可以通过单个呼叫收集大的字符缓冲区稳定的流。
当通过某种流量控制阻止传输或者当调用SetCommBreak函数来暂停字符传输时,写入操作的超时可能是有用的。
下表总结了基于为总计和间隔超时指定的值的读取操作的行为。
总 | 间隔 | 行为 |
0 | 0 | 缓冲区完全填满时返回。超时不被使用。 |
T | 0 | 当缓冲区完全填充或从操作开始经过T毫秒后返回。 |
0 | Y | 当缓冲区完全填充或在接收任何两个字符之间经过了Y毫秒时,返回。直到收到第一个字符才开始计时。 |
T | Y | 缓冲区完全填充或任何一种类型的超时发生时返回。 |
但是请注意,该时序是相对于控制物理设备的系统。对于诸如调制解调器的远程设备,定时是相对于调制解调器连接到的服务器系统。不考虑任何网络传播延迟。例如,客户端应用程序可能会指定计算为500毫秒的总超时。当服务器经过500毫秒时,会向客户端返回超时错误。如果存在50毫秒的网络传播延迟,客户端将不会被通知超时,直到实际发生超时后的大约50毫秒。
超时参数影响通信设备上重叠的读写操作的行为。使用重叠I / O时,ReadFile,WriteFile,ReadFileEx或WriteFileEx功能可在操作完成前返回。超时参数可以确定操作何时完成。