SERIAL_TIMEOUTS 结构指定串行端口读取和写入作的超时参数。
语法
typedef struct _SERIAL_TIMEOUTS {
ULONG ReadIntervalTimeout;
ULONG ReadTotalTimeoutMultiplier;
ULONG ReadTotalTimeoutConstant;
ULONG WriteTotalTimeoutMultiplier;
ULONG WriteTotalTimeoutConstant;
} SERIAL_TIMEOUTS, *PSERIAL_TIMEOUTS;
成员
ReadIntervalTimeout
读取作中允许两个连续字节之间的最长时间(以毫秒为单位)。 超过此最大超时的读取作。此最大值不适用于第一个字节读取之前的时间间隔。 值为零表示不使用间隔超时。 有关详细信息,请参阅“备注”。
ReadTotalTimeoutMultiplier
读取作中每个字节允许的最大时间(以毫秒为单位)。 超过此最大超时的读取作。有关详细信息,请参阅“备注”。
ReadTotalTimeoutConstant
每个读取作允许的最大额外时间(以毫秒为单位)。 超过此最大超时的读取作。有关详细信息,请参阅“备注”。
WriteTotalTimeoutMultiplier
写入作中每个字节允许的最大总时间(以毫秒为单位)。 超过此最大超时的写入作。有关详细信息,请参阅“备注”。
WriteTotalTimeoutConstant
每个写入作允许的最大额外时间(以毫秒为单位)。 超过此最大超时的写入作。有关详细信息,请参阅“备注”。
言论
IOCTL_SERIAL_SET_TIMEOUTS 和 IOCTL_SERIAL_GET_TIMEOUTS I/O 控制请求使用 SERIAL_TIMEOUTS 结构。 IOCTL_SERIAL_SET_TIMEOUTS I/O 控制请求使用此结构来指定串行端口用于读取和写入作的一组超时参数。 IOCTL_SERIAL_GET_TIMEOUTS I/O 控制请求使用此结构检索上一 IOCTL_SERIAL_SET_TIMEOUTS 请求设置的超时参数。
传输指定字节数或请求的读取或写入作超时时,读取或写入请求成功完成。请求返回STATUS_SUCCESS状态代码,以指示已传输指定的字节数。 请求返回STATUS_TIMEOUT状态代码,以指示作超时。
如果 IRP_MJ_READ 请求指定一个长度为 Ntₒtₐl 字节的读取作,则最大时间量 Tmₐₓ,则串行端口允许作完成的计算方式如下:
Tmₐₓ = Ntₒtₐl * ReadTotalTimeoutMultiplier + ReadTotalTimeoutConstant
超过此最大值的读取请求在发生超时时完成,并返回STATUS_TIMEOUT状态代码。 I/O 状态块的 信息 字段指示在超时发生前已成功读取的字节数。
如果 IRP_MJ_WRITE 请求指定一个长度为 Ntₒtₐl 字节的写入作,则串行端口允许该作完成的最大时间量(Tmₐₓ)的计算方式如下:
Tmₐₓ = Ntₒtₐl * WriteTotalTimeoutMultiplier + WriteTotalTimeoutConstant
超过此最大值的写入请求在发生超时时完成,并返回STATUS_TIMEOUT状态代码。 I/O 状态块的 信息 字段指示在超时发生前成功写入的字节数。
允许读取或写入作完成的最长时间 Tmₐₓ 始终从串行端口启动请求的作开始,而不是从客户端提交请求时测量。
如果 ReadIntervalTimeout,ReadTotalTimeoutMultiplier,并且 ReadTotalTimeoutConstant 均为零,读取作永远不会超时。如果 WriteTotalTimeoutMultiplier 和 WriteTotalTimeoutConstant 均为零,则写入作永远不会超时。
如果 ReadIntervalTimeout 为零,则读取作中的连续字节之间没有最大间隔,超时仅基于 ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 成员。
如果 ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 均为零,并且 ReadIntervalTimeout 小于 MAXULONG 且大于零,则仅当连续接收的字节对之间的间隔超过 ReadIntervalTimeout时,读取作才会超时。 如果使用这三个超时值,并且当读取请求发送到端口时,串行端口的输入缓冲区为空,则此请求在端口接收至少一个字节的新数据之后才会超时。
如果 ReadIntervalTimeout 设置为 MAXULONG,并且 ReadTotalTimeoutConstant 和 ReadTotalTimeoutMultiplier 为零,则读取请求将立即完成已接收的字节数,即使未收到任何字节也是如此。 在这种情况下,读取请求返回STATUS_SUCCESS状态代码。
如果 ReadIntervalTimeout 和 ReadTotalTimeoutMultiplier 都设置为 MAXULONG,并且 ReadTotalTimeoutConstant 设置为大于零且小于 MAXULONG 的值,则读取请求的行为如下所示:
- 如果串行端口的输入缓冲区中有任何字节,读取请求将立即完成缓冲区中的字节,并返回STATUS_SUCCESS状态代码。
- 如果输入缓冲区中没有字节,则串行端口会等待字节到达,然后立即使用一个字节数据完成读取请求,并返回STATUS_SUCCESS状态代码。
- 如果没有字节在 ReadTotalTimeoutConstant指定的时间内到达,则读取请求超时,将 I/O 状态块的 信息 字段设置为零,并返回STATUS_TIMEOUT状态代码。
读取间隔超时可用于检测传入数据流的末尾(如果数据流的长度事先未知)。 如果读取请求使用此技术,STATUS_TIMEOUT完成状态代码通常意味着请求成功完成。
当传入字节之间的间隔超过 ReadIntervalTimeout 值时,将发生读取间隔超时。 超时间隔相对于系统时钟进行度量,超时度量的准确性受系统时钟粒度的限制。 因此,一个系统时钟时钟周期早于指定的超时间隔和一个时钟周期(具体取决于此间隔的开始和结束时间在系统时钟时钟周期之间的确切位置)之间发生超时。 即使系统时钟中断处理因其他设备的中断处理而延迟,也会发生超时。 如果指定的超时间隔接近或小于系统时钟周期之间的时间段,则超时可能会立即发生,且不会延迟。
更准确地测量更小的超时间隔的可能方法是减少系统时钟时钟周期之间的时间,但这样做可能会增加能耗。 此外,减少系统时钟周期可能无法可靠地实现更精细的系统时钟粒度,除非平台中各种驱动程序的中断相关处理可以保证不延迟系统时钟中断的处理。
SERIAL_TIMEOUTS 结构类似于 COMMTIMEOUTS 结构,该结构由用户模式 SetCommTimeouts 和 GetCommTimeouts 函数使用。
有关详细信息,请参阅 设置串行设备的读取和写入超时。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows 2000 开始支持。 |
标头 | ntddser.h |