1. 程式人生 > >串列埠程式設計-讀寫超時 COMMTIMEOUTS設定

串列埠程式設計-讀寫超時 COMMTIMEOUTS設定

讀寫超時是在   呼叫  ReadFile 和  WriteFile   函式讀寫串列埠的時候系統提供的超時機制

typedef struct _COMMTIMEOUTS {

    DWORD ReadIntervalTimeout;          /* Maximum time between read chars. */

    DWORD ReadTotalTimeoutMultiplier;  

/* Multiplier of characters.        */

    DWORD ReadTotalTimeoutConstant;     /* Constant in milliseconds.        */

    DWORD WriteTotalTimeoutMultiplier;  /* Multiplier of characters.        */

    DWORD WriteTotalTimeoutConstant;    /* Constant in milliseconds.        */

} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

  


讀超時 有兩隻計算方法

1:(間隔超時)ReadIntervalTimeout 指定了在接收字元間的最大時間,如果超過了這個時間,ReadFile立即返回。

2:(總超時)基於要接收的字元數量

ReadTotalTimeoutMultiplier表示平均讀一個位元組的時間上限

ReadTotalTimeoutConstant表示讀資料總時間常量

讀資料總超時:ReadTotalTimeoutConstant +(ReadTotalTimeoutMultiplier*要讀的位元組數)

讀資料超時,兩種超時同時有效,當出現任何一種超時時,ReadFile都將返回。

寫超時:

WriteTotalTimeoutMultiplier表示平均寫一個位元組的時間上限

WriteTotalTimeoutConstant表示寫資料總超時常量

寫資料總超時 :WriteTotalTimeoutConstatn +(WriteTotalTimeoutMultiplier *要寫的位元組數)

 

具體超時設定

1: 有讀間隔超時、讀總超時、寫總超時,將COMMTIMEOUTS結構5個成員設定為對應值。

2:沒有讀間隔超時,有讀總超時和寫總超時,將RealIntervalTimeou設定為0,其他引數設定為對應值。

3:不管是否有資料要讀取,ReadFile立即返回,將RealIntervalTimeout設定為MAX_DWORD,

將ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都設定為0

(不立即返回的時候,可以在超時時間內等串列埠中有新的資料?然後讀取,直到超時時間)

 

 

4:ReadFile沒有超時設定,直到有適當的字元數返回或者錯誤發生,函式才返回。

將 ReadIntervalTimeout、ReadTotalTimeoutMultiplier、ReadTotalTimeoutConstant都設定為0

5:WriteFile沒有超時設定:將WriteTotalTimeoutMultiplier和WriteTotalTimeoutConstant設定為0