SERIAL_TIMEOUTS 结构 (ntddser.h)

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

每个写入操作允许的最大额外时间量(以毫秒为单位)。 超过此最大超时的写入操作。有关详细信息,请参阅备注。

注解

SERIAL_TIMEOUTS结构由IOCTL_SERIAL_SET_TIMEOUTSIOCTL_SERIAL_GET_TIMEOUTS I/O 控制请求使用。 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ₐₓ 始终从串行端口开始请求操作,而不是从客户端提交请求时开始测量。

如果 ReadIntervalTimeoutReadTotalTimeoutMultiplierReadTotalTimeoutConstant 均为零,则读取操作永远不会超时。如果 WriteTotalTimeoutMultiplierWriteTotalTimeoutConstant 均为零,则写入操作永远不会超时。

如果 ReadIntervalTimeout 为零,则读取操作中连续字节之间没有最大间隔,并且超时仅基于 ReadTotalTimeoutMultiplierReadTotalTimeoutConstant 成员。

如果 ReadTotalTimeoutMultiplierReadTotalTimeoutConstant 均为零,并且 ReadIntervalTimeout 小于 MAXULONG 且大于零,则仅当一对连续接收的字节之间的间隔超过 ReadIntervalTimeout 时,读取操作才会超时。 如果使用这三个超时值,并且向端口发送读取请求时串行端口的输入缓冲区为空,则此请求在端口收到至少一个字节的新数据之前永远不会超时。

如果 ReadIntervalTimeout 设置为 MAXULONG,并且 ReadTotalTimeoutConstantReadTotalTimeoutMultiplier 均为零,则读取请求将立即完成已接收的字节,即使未收到任何字节。 在这种情况下,读取请求返回STATUS_SUCCESS状态代码。

如果 ReadIntervalTimeoutReadTotalTimeoutMultiplier 都设置为 MAXULONG,并且 ReadTotalTimeoutConstant 设置为大于零且小于 MAXULONG 的值,则读取请求的行为如下所示:

  • 如果串行端口的输入缓冲区中有任何字节,读取请求将立即完成缓冲区中的字节,并返回STATUS_SUCCESS状态代码。
  • 如果输入缓冲区中没有字节,则串行端口将等待字节到达,然后立即使用一个字节的数据完成读取请求,并返回STATUS_SUCCESS状态代码。
  • 如果在 ReadTotalTimeoutConstant 指定的时间内没有字节到达,读取请求将超时,将 I/O 状态块的 “信息” 字段设置为零,并返回STATUS_TIMEOUT状态代码。
如果 ReadIntervalTimeoutReadTotalTimeoutConstant 都设置为 MAXULONG,IOCTL_SERIAL_SET_TIMEOUTS请求失败并返回INVALID_PARAMETER错误状态代码。

读取间隔超时可用于检测传入数据流的结束时间(如果数据流的长度事先未知)。 如果读取请求使用此技术,STATUS_TIMEOUT完成状态代码通常意味着请求已成功完成。

当传入字节之间的间隔超过 ReadIntervalTimeout 值时,将发生读取间隔超时。 超时间隔相对于系统时钟进行测量,超时测量的准确性受系统时钟粒度的限制。 因此,在早于指定的超时间隔的一个系统时钟计时周期和晚一个时钟周期之间可能会发生超时,具体取决于此间隔的开始和结束时间在系统时钟计时周期之间的确切位置。 如果系统时钟中断处理因其他设备的中断处理而延迟,则甚至以后也可能发生超时。 如果指定的超时间隔接近或小于系统时钟周期之间的时间段,则超时可能会立即发生,且无延迟。

更准确地测量较小超时间隔的一种可能方法是减少系统时钟时钟周期之间的时间,但这样做可能会增加功耗。 此外,缩短系统时钟周期可能无法可靠地实现更精细的系统时钟粒度,除非可以保证平台中各种驱动程序的中断相关处理不会延迟系统时钟中断的处理。

SERIAL_TIMEOUTS结构类似于用户模式 SetCommTimeouts 和 GetCommTimeouts 函数使用的 COMMTIMEOUTS 结构。

有关详细信息,请参阅 为串行设备设置读取和写入超时

要求

要求
最低受支持的客户端 从 Windows 2000 开始受支持。
标头 ntddser.h

另请参阅

COMMTIMEOUTS

GetCommTimeouts

IOCTL_SERIAL_SET_TIMEOUTS

IRP_MJ_READ

IRP_MJ_WRITE

SerCxGetReadIntervalTimeout

SetCommTimeouts