2009年12月31日 星期四

COMMTIMEOUTS結構 超時設置

2.COMMTIMEOUTS結構 超時設置

COMMTIMEOUTS:COMMTIMEOUTS主要用於串口超時參數設置。COMMTIMEOUTS結構如下:

typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; //讀間隔超時
DWORD ReadTotalTimeoutMultiplier;// 讀時間係數
DWORD ReadTotalTimeoutConstant; // 讀時間常量
DWORD WriteTotalTimeoutMultiplier; // 寫時間係數
DWORD WriteTotalTimeoutConstant; // 寫時間常量
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;


  ReadIntervalTimeout:兩字符之間最大的延時,當讀取串口數據時,一旦兩個字符傳輸的時間差超過該時間,讀取函數將返回現有的數據。設置為0表示該參數不起作用。

  ReadTotalTimeoutMultiplier:讀取每字符間的超時。

  ReadTotalTimeoutConstant:一次讀取串口數據的固定超時。所以在一次讀取串口的操作中,其超時為ReadTotalTimeoutMultiplier乘以讀取的字節數再加上 ReadTotalTimeoutConstant。將ReadIntervalTimeout設置為MAXDWORD,並將ReadTotalTimeoutMultiplier 和ReadTotalTimeoutConstant設置為0,表示讀取操作將立即返回存放在輸入緩衝區的字符。

  WriteTotalTimeoutMultiplier:寫入每字符間的超時。

  WriteTotalTimeoutConstant:一次寫入串口數據的固定超時。所以在一次寫入串口的操作中,其超時為WriteTotalTimeoutMultiplier乘以寫入的字節數再加上 WriteTotalTimeoutConstant。

一般都會做以下設置:
TimeOuts.ReadIntervalTimeout=MAXDWORD;
// 把間隔超時設為最大,把總超時設為0將導致ReadFile立即返回並完成操作

TimeOuts.ReadTotalTimeoutMultiplier=0;
//讀時間係數

TimeOuts.ReadTotalTimeoutConstant=0;
//讀時間常量

TimeOuts.WriteTotalTimeoutMultiplier=50;
//總超時=時間係數*要求讀/寫的字符數+時間常量

TimeOuts.WriteTotalTimeoutConstant=2000;
//設置寫超時以指定WriteComm成員函數中的

3.DCB結構

DCB (Device Control Block) 設備控制塊

在打開通訊串口後,我們需要對串口進行初始化,比如,波特率、奇偶位、校驗位等,在查詢或者配置這些數據時,都要用DCB進行緩衝,可以調用GetcommState函數獲得當前串口配置,以下是DCB的具體成員:

typedef struct _DCB {// dcb
  DWORD DCBlength; // sizeof(DCB)
  DWORD BaudRate; // current baud rate
  指定當前的波特率
  DWORD fBinary: 1; // binary mode, no EOF check
  指定是否允許二進制模式,
  WINDOWS 95中必須為TRUE
  DWORD fParity: 1; // enable parity checking
  指定奇偶校驗是否允許
  DWORD fOutxCtsFlow:1; // CTS output flow control
  指定CTS是否用於檢測發送控制。
  當為TRUE是CTS為OFF,發送將被掛起。
  DWORD fOutxDsrFlow:1; // DSR output flow control
  指定CTS是否用於檢測發送控制。
  當為TRUE是CTS為OFF,發送將被掛起。
  DWORD fDtrControl:2; // DTR flow control type
  DTR_CONTROL_DISABLE值將DTR置為OFF, DTR_CONTROL_ENABLE值將DTR置為ON, DTR_CONTROL_HANDSHAKE允許DTR"握手",DWORD fDsrSensitivity:1; // DSR sensitivity 當該值為TRUE時DSR為OFF時接收的字節被忽略
  DWORD fTXContinueOnXoff:1; // XOFF continues Tx
  指定當接收緩衝區已滿,並且驅動程序已經發
  送出XoffChar字符時發送是否停止。
  TRUE時,在接收緩衝區接收到緩衝區已滿的字節XoffLim且驅動程序已經發送出XoffChar字符中止接收字節之後,發送繼續進行。
  FALSE時,在接收緩衝區接收到代表緩衝區已空的字節XonChar且驅動程序已經發送出恢復發送的XonChar之後,發送繼續進行。
  DWORD fOutX: 1; // XON/XOFF out flow c

參考來源:

"COMMTIMEOUTS結構 超時設置"
- 串口通讯编程一日通3(COMMTIMEOUTS DCB整理) - September - CSDN博客 (在「Google 網頁註解」中檢視)

沒有留言:

張貼留言