COMMTIMEOUTS

在用ReadFile和WriteFile讀寫串列口時,需要考慮逾時問題。如果在指定的時間內沒有讀出或寫入指定數量的字元,那么ReadFile或WriteFile的操作就會結束。要查詢當前的逾時設定應調用GetCommTimeouts函式,該函式會填充一個COMMTIMEOUTS結構。調用SetCommTimeouts可以用某一個COMMTIMEOUTS結構的內容來設定逾時。 有兩種逾時:間隔逾時和總逾時。間隔逾時是指在接收時兩個字元之間的最大時延,總逾時是指讀寫操作總共花費的最大時間。寫操作只支持總逾時,而讀操作兩種逾時均支持。

基本介紹

  • 中文名:COMMTIMEOUTS
  • 基礎:用ReadFile讀寫串列口
  • 原因:需要考慮逾時問題
  • 功能:COMMTIMEOUTS的內容來設定逾時
用COMMTIMEOUTS結構可以規定讀/寫操作的逾時,該結構的定義為:
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; // 讀間隔逾時
DWORD ReadTotalTimeoutMultiplier; // 讀時間係數
DWORD ReadTotalTimeoutConstant; // 讀時間常量
DWORD WriteTotalTimeoutMultiplier; // 寫時間係數
DWORD WriteTotalTimeoutConstant; // 寫時間常量
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
COMMTIMEOUTS結構的成員都以毫秒為單位。
ReadIntervalTimeout:兩字元之間最大的延時,當讀取串口數據時,一旦兩個字元傳輸的時間差超過該時間,讀取函式將返回現有的數據。設定為0表示該參數不起作用。指定時間最大值(毫秒),允許接收的2個位元組間有時間差。也就 是說,剛接收了一個位元組後,等了ReadIntervalTimeout時間後還沒有新的位元組到達,就 認為本次讀串口操作結束(後面的位元組等下一次讀取操作來處理)。即使你想讀8個位元組,但讀第2個位元組後,過了ReadIntervalTimeout時間後,第3個位元組還沒到。實際上就唯讀了2個位元組。
ReadTotalTimeoutMultiplier:指定比例因子(毫秒),實際上是設定讀取一個位元組和等待下一個位元組所需的時間,這樣總的逾時時間為讀取的位元組數乘以該值,同樣一次讀取操作到達這個時間後,也認為本次讀操作己經結束。
ReadTotalTimeoutConstant:一次讀取串口數據的固定逾時。所以在一次讀取串口的操作中,其逾時為ReadTotalTimeoutMultiplier乘以讀取的位元組數再加上 ReadTotalTimeoutConstant。將ReadIntervalTimeout設定為MAXDWORD,並將ReadTotalTimeoutMultiplier 和ReadTotalTimeoutConstant設定為0,表示讀取操作將立即返回存放在輸入緩衝區的字元。可以理解為一個修正時間,實際上就是按ReadTotalTimeoutMultiplier計算出的逾時時間再加上該時間才作為整個逾時時間。
WriteTotalTimeoutMultiplier:寫入每字元間的逾時。
WriteTotalTimeoutConstant:一次寫入串口數據的固定逾時。所以在一次寫入串口的操作中,其逾時為WriteTotalTimeoutMultiplier乘以寫入的位元組數再加上 WriteTotalTimeoutConstant。
一般都會做以下設定:
TimeOuts.ReadIntervalTimeout=MAXDWORD;
// 把間隔逾時設為最大,把總逾時設為0將導致ReadFile立即返回並完成操作
TimeOuts.ReadTotalTimeoutMultiplier=0;
//讀時間係數
TimeOuts.ReadTotalTimeoutConstant=0;
//讀時間常量
TimeOuts.WriteTotalTimeoutMultiplier=50;
//總逾時=時間係數*要求讀/寫的字元數+時間常量
TimeOuts.WriteTotalTimeoutConstant=2000;
//設定寫逾時以指定WriteComm成員函式中的
總逾時的計算公式是:
總逾時=時間係數×要求讀/寫的字元數 + 時間常量
例如,如果要讀入10個字元,那么讀操作的總逾時的計算公式為:
讀總逾時=ReadTotalTimeoutMultiplier×10 + ReadTotalTimeoutConstant
可以看出,間隔逾時和總逾時的設定是不相關的,這可以方便通信程式靈活地設定各種逾時。如果所有寫逾時參數均為0,那么就不使用寫逾時。如果ReadIntervalTimeout為0,那么就不使用讀間隔逾時,如果
ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都為0,則不使用讀總逾時。如果讀間隔逾時被設定成MAXDWORD並且兩個讀總逾時為0,那么在讀一次輸入緩衝區中的內容後讀操作就立即完成,而不管是否讀入了要求的字元。 在用重疊方式讀寫串列口時,雖然ReadFile和WriteFile在完成操作以前就可能返回,但逾時仍然是起作用的。在這種情況下,逾時規定的是操作的完成時間,而不是ReadFile和WriteFile的返回時間。

相關詞條

熱門詞條

聯絡我們