структура 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_TIMEOUTS и IOCTL_SERIAL_GET_TIMEOUTS ввода-вывода. В IOCTL_SERIAL_SET_TIMEOUTS запросе управления вводом-выводом эта структура используется для указания набора параметров времени ожидания для последовательного порта, который будет использоваться для операций чтения и записи. Эта структура используется для получения параметров времени ожидания, заданных предыдущим запросом IOCTL_SERIAL_SET_TIMEOUTS, в запросе управления IOCTL_SERIAL_GET_TIMEOUTS ввода-вывода.

Запрос на чтение или запись успешно завершается, когда передается указанное количество байтов или истекает время ожидания запрошенной операции чтения или записи. Запрос возвращает код состояния STATUS_SUCCESS, указывающий, что было передано указанное количество байтов. Запрос возвращает код состояния STATUS_TIMEOUT, указывающий, что истекло время ожидания операции.

Если запрос IRP_MJ_READ указывает операцию чтения, которая имеет длину Ntₒtₐl байтов, максимальное время Tmₐₓ, позволяющее последовательному порту для завершения операции, вычисляется следующим образом:

Tmₐₓ = Ntₒtₐl * ReadTotalTimeoutMultiplier + ReadTotalTimeoutConstant

Запрос на чтение, превышающий это максимальное значение, завершается при истечении времени ожидания и возвращает код состояния STATUS_TIMEOUT. Поле Information блока состояния ввода-вывода указывает количество байтов, успешно прочитанных до истечения времени ожидания.

Если в запросе IRP_MJ_WRITE указана операция записи ntₒtₐl байтов в длину, то максимальное время , Tmₐₓ, которое позволяет последовательный порт для завершения операции, вычисляется следующим образом:

Tmₐₓ = Ntₒtₐl * WriteTotalTimeoutMultiplier + WriteTotalTimeoutConstant

Запрос на запись, превышающий это максимальное значение, завершается при истечении времени ожидания и возвращает код состояния STATUS_TIMEOUT. Поле Information блока состояния ввода-вывода указывает количество байтов, успешно записанных до истечения времени ожидания.

Максимальное время (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, время ожидания запроса на чтение истекает, задается нулевое поле Information блока состояния ввода-вывода и возвращается код состояния STATUS_TIMEOUT.
Запрос IOCTL_SERIAL_SET_TIMEOUTS завершается сбоем и возвращает код состояния ошибки INVALID_PARAMETER, если для параметра ReadIntervalTimeout и ReadTotalTimeoutConstant задано значение MAXULONG.

Время ожидания интервала чтения можно использовать для определения конца входящего потока данных, когда длина потока данных не известна заранее. Если этот метод используется в запросе на чтение, код состояния STATUS_TIMEOUT завершения обычно означает, что запрос выполнен успешно.

Время ожидания интервала чтения возникает, когда интервал между входящими байтами превышает значение ReadIntervalTimeout . Интервалы времени ожидания измеряются относительно системных часов, а точность измерения времени ожидания ограничивается степенью детализации системных часов. В результате время ожидания может возникать между одним тиком системных часов раньше и на один тик позже указанного интервала времени ожидания в зависимости от того, где именно время начала и окончания этого интервала попадает между тактами системных часов. Время ожидания может произойти даже позже, если обработка прерываний системных часов задерживается обработкой прерываний для других устройств. Если указанный интервал времени ожидания близок к периоду между тактами системных часов или меньше, время ожидания может наступить немедленно, без задержки.

Возможный способ более точного измерения меньших интервалов времени ожидания заключается в уменьшении времени между тактами системных часов, но это, скорее всего, приведет к увеличению энергопотребления. Кроме того, уменьшение периода системных часов может не обеспечить более точной детализации системных часов, если только обработка, связанная с прерываниями различными драйверами на платформе, не будет гарантированно задерживать обработку прерываний системных часов.

Структура SERIAL_TIMEOUTS аналогична структуре COMMTIMEOUTS , которая используется функциями SetCommTimeouts и GetCommTimeouts в пользовательском режиме.

Дополнительные сведения см. в разделе Настройка времени ожидания чтения и записи для последовательного устройства.

Требования

Требование Значение
Минимальная версия клиента Поддерживается начиная с Windows 2000.
Верхняя часть ntddser.h

См. также раздел

COMMTIMEOUTS

GetCommTimeouts

IOCTL_SERIAL_SET_TIMEOUTS

IRP_MJ_READ

IRP_MJ_WRITE

SerCxGetReadIntervalTimeout

SetCommTimeouts