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

每個寫入作業允許的最大額外時間量,以毫秒為單位。 超過此最大逾時的寫入作業。如需詳細資訊,請參閱。

備註

IOCTL_SERIAL_SET_TIMEOUTSIOCTL_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ₐₓ,一律會從序列埠啟動要求的作業時測量,而不是從用戶端提交要求時測量。

如果 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 結構類似於 COMMTIMEOUTS 結構,這是使用者模式 SetCommTimeoutsGetCommTimeouts 函式所使用的結構。

如需詳細資訊,請參閱 設定序列裝置的讀取和寫入逾時

規格需求

需求
最低支援的用戶端 從 Windows 2000 開始支援。
標頭 ntddser.h

另請參閱

COMMTIMEOUTS

GetCommTimeouts

IOCTL_SERIAL_SET_TIMEOUTS

IRP_MJ_READ

IRP_MJ_WRITE

SerCxGetReadIntervalTimeout

SetCommTimeouts