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_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 |