共用方式為


從SerCx2-Managed序列埠讀取資料

序列控制器 (或 UART) 通常包含接收 FIFO。 此 FIFO 提供從連接到序列埠之周邊裝置接收之資料的硬體控制緩衝處理。 若要從接收 FIFO 讀取資料,此裝置的周邊驅動程式會將讀取 (IRP_MJ_READ) 要求傳送至序列埠。

如果序列埠繼續接收資料的速度比周邊驅動程式可以讀取資料更快,接收 FIFO 可能會溢位。 為了防止資料因為溢位而遺失,周邊驅動程式通常會將序列埠設定為使用硬體流程式控制制。 使用流程式控制制時,序列控制器硬體會自動向周邊裝置發出訊號,以在接收 FIFO 即將滿時停止傳送資料。 根據規則,SerCx2 所管理的序列埠應該使用硬體流程式控制制。 如需詳細資訊,請參閱 流程式控制制詳細資料

不過,流量控制不應該用來停止周邊裝置傳送資料太長的時間,或裝置可能無法繼續正常運作。 例如,周邊裝置可能會有內部資料緩衝區,如果裝置被防止太長而無法從這個緩衝區將資料傳送到序列埠,可能會溢位。

此頁面上

使用非同步讀取要求

若要避免不正確的作業和可能的資料遺失,周邊驅動程式會負責及時從序列控制器的接收 FIFO 讀取資料。 一般而言,在收到資料之前,周邊驅動程式會將非同步讀取要求傳送至序列埠,以預期未來從周邊裝置抵達資料。 此讀取要求會保留在 SerCx2 I/O 佇列中擱置,直到資料可從接收 FIFO 讀取為止。

在大部分的硬體平臺上,周邊驅動程式一次不需要有多個這類讀取要求擱置。 在罕見的情況下,如果收到資料之後,驅動程式可能需要一個以上的未完成讀取要求,讀取要求需要很長的時間才能處理,才能完成產生的資料備份會導致周邊裝置遺失資料,否則行為不正確。

假設周邊驅動程式一次只有一個這類讀取要求擱置中,則此要求中所需的資料緩衝區大小主要取決於周邊裝置的已知行為。 例如,如果驅動程式事先知道從裝置預期的資料位元組數,驅動程式會將要求中的緩衝區大小設定為這個位元組數目。 一旦緩衝區填入來自接收 FIFO 的資料,就會完成讀取要求。 為了回應,驅動程式可以非同步傳送新的讀取要求,以等候下一個資料區塊。

不過,周邊驅動程式可能事先不知道周邊裝置需要多少資料。 在此情況下,驅動程式會將讀取要求中的資料緩衝區設定為適當的大小,然後依賴時間間隔逾時來識別周邊裝置的資料結尾。 為讀取緩衝區選擇適當的大小可能需要有關周邊裝置運作方式的詳細知識。 如果讀取緩衝區太小,驅動程式必須傳送一或多個額外的讀取要求,才能完成讀取資料。

間隔逾時詳細資料

若要設定讀取和寫入要求的逾時參數,周邊驅動程式可以將 IOCTL_SERIAL_SET_TIMEOUTS 要求傳送至序列埠。 讀取的逾時是由此要求中的 ReadIntervalTimeoutReadTotalTimeoutMultiplierReadTotalTimeoutConstant 參數值所控制。 ReadIntervalTimeout 指定接收交易中兩個連續位元組之間允許的最大時間間隔。 如果 ReadTotalTimeoutMultiplierReadTotalTimeoutConstant 都是零,而且當讀取要求傳送至序列埠時,序列控制器的接收 FIFO 是空的,則此要求不會逾時 (,因此在 SerCx2 I/O 佇列中維持擱置狀態) ,直到埠收到至少一個位元組的新資料為止。 如需詳細資訊,請參閱 SERIAL_TIMEOUTS

晶片上系統上的序列埠 (SoC) 整合線路,可能會以每秒數個 MB 或更高的尖峰速率從周邊裝置接收資料。 此裝置周邊驅動程式的開發人員可能會想要將 ReadIntervalTimeout) 參數所指定的時間間隔 (逾時值設定為毫秒或更少,但此值不太可能有預期的效果。 這是因為用來偵測時間間隔逾時的計時器精確度受限於系統時鐘的資料細微性。

例如,如果系統時鐘週期是 15 毫秒,而驅動程式會將 ReadIntervalTimeout 值設定為 1 毫秒,則範圍從 0 到 15 毫秒的位元組間隔可能會觸發逾時。有時候,此設定可能會導致從周邊裝置傳輸資料傳輸期間發生逾時。 為了確保只有在完成此傳輸之後,才會發生逾時,驅動程式可以將 ReadIntervalTimeout 設定為大於 15 毫秒的值。 例如,如果 ReadIntervalTimeout 設定為 20 毫秒,位元組對位元組間隔 30 毫秒會可靠地觸發逾時,而 15 毫秒或更少間隔不會觸發逾時。

如需計時器精確度如何相依于系統時鐘的詳細資訊,請參閱 計時器精確度

流程式控制制詳細資料

最佳做法是,使用 SerCx2 受控序列埠的周邊驅動程式應該將這些埠設定為使用硬體流程式控制制,以防止接收 FIFO 溢位。 如果沒有擱置的讀取要求,SerCx2 不會提供超過接收 FIFO 容量的接收資料軟體緩衝。 如果允許此 FIFO 溢位,資料就會遺失。

若要啟用硬體流程式控制制,周邊驅動程式可能會傳送 IOCTL_SERIAL_SET_HANDFLOW 要求來設定序列埠的交握和流程式控制制設定。 或者,驅動程式可能會傳送 IOCTL_SERIAL_APPLY_DEFAULT_CONFIGURATION 要求來設定序列埠,以使用包含硬體流程式控制制的預設硬體設定集。 IOCTL_SERIAL_SET_HANDFLOW要求會使用SERIAL_HANDFLOW結構來描述流程式控制制設定。 IOCTL_SERIAL_APPLY_DEFAULT_CONFIGURATION要求可能包含廠商指定資料格式的類似資訊。

如果周邊驅動程式使用 IOCTL_SERIAL_SET_HANDFLOW 要求來啟用硬體流程式控制制,驅動程式應該在此要求中的 SERIAL_HANDFLOW 結構中設定下列旗標:

  • 結構 ControlHandShake 成員中的SERIAL_CTS_HANDSHAKE旗標。 此旗標可讓序列埠對接收作業使用流程式控制制。
  • FlowReplace成員中的SERIAL_RTS_CONTROL和SERIAL_RTS_HANDSHAKE旗標。 這些旗標可讓序列埠使用流量控制來進行傳輸作業。