1. 程式人生 > >拿走不謝: WIN32 API 中串列埠DCB 結構

拿走不謝: WIN32 API 中串列埠DCB 結構

DWORD DCBlength;

sizeof(DCB)

DWORD BaudRate;

current baud rate 指定當前的波特率

DWORD fBinary: 1;

binary mode, no EOF check 指定是否允許二進位制模式WIN95中須為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是否用於檢測傳送控制。(資料裝備好)當為TRUECTSOFF,傳送將被掛起。

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 當該值為TRUEDSROFF時接收的位元組被忽略

DWORD fTXContinueOnXoff:1;

XOFF continues Tx

指定當接收緩衝區已滿,並且驅動程式已經發送出XoffChar字元時傳送是否停止。

TRUE時,在接收緩衝區接收到緩衝區已滿的位元組XoffLim且驅動程式已經發送出XoffChar

 符中止接收位元組之後,傳送繼續進行。

FALSE時,在接收緩衝區接收到代表緩衝區已空的位元組XonChar且驅動程式已經發送出恢復傳送的XonChar之後,傳送繼續進行。

DWORD fOutX: 1;

XON/XOFF out flow control   

//TRUE時,接收到XoffChar之後便停止傳送

//FALSE時,接收到XonChar之後將重新開始

DWORD fInX: 1;

// XON/XOFF in flow control

TRUE時,接收緩衝區接收到代表緩衝區滿的XoffLim之後,XoffChar傳送出去

接收緩衝區接收到代表緩衝區空的XonLim之後,XonChar傳送出去

DWORD fErrorChar: 1;

// enable error replacement
該值為TRUEfParityTRUE時,用ErrorChar 成員指定的字元代替奇偶校驗錯誤的接收字元

DWORD fNull: 1;

// enable null stripping  TRUE時,接收時去掉空(0值)位元組

DWORD fRtsControl:2;

RTS flow control

DWORD fAbortOnError:1;

abort reads/writes on error  TRUE,有錯誤發生時中止讀和寫操作
RTS_CONTROL_DISABLE,RTS置為OFF
RTS_CONTROL_ENABLE
, RTS置為ON
RTS_CONTROL_HANDSHAKE
,
當接收緩衝區小於半滿時RTSON
當接收緩衝區超過四分之三滿時RTSOFF
RTS_CONTROL_TOGGLE
,
當接收緩衝區仍有剩餘位元組時RTSON ,否則預設為OFF

DWORD fDummy2:17;

reserved  未使用

WORD wReserved;

not currently used  未使用,必須為0

WORD XonLim;

// transmit XON threshold
指定在XON字元傳送這前接收緩衝區中可允許的最小位元組數

WORD XoffLim;

// transmit XOFF threshold
指定在XOFF字元傳送這前接收緩衝區中可允許的最小位元組數

BYTE ByteSize;

number of bits/byte, 4-8  指定埠當前使用的資料位

BYTE Parity;

// 0-4=no,odd,even,mark,space 指定埠當前使用的奇偶校驗方法,可能為:
EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY

BYTE StopBits;

0,1,2 = 1, 1.5, 2   指定埠當前使用的停止位數,可能為:
ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS

char XonChar;

// Tx and Rx XON character  指定用於傳送和接收字元XON的值

char XoffChar;

Tx and Rx XOFF character  指定用於傳送和接收字元XOFF

char ErrorChar;

// error replacement character本字元用來代替接收到的奇偶校驗發生錯誤時的值

char EofChar;

// end of input character 當沒有使用二進位制模式時,本字元可用來指示資料的結束

char EvtChar;

// received event character 當接收到此字元時,會產生一個事件

WORD wReserved1;

// reserved; do not use 未使用

在這個結構中, 共有28個變數, 我把這些成員歸類為幾種.
1. 
串列埠的基本設定
     1) DWORD BaudRate;                      波特率設定。 
     2) BYTE ByteSize;                            
資料位設定。
     3) DWORD fParity: 1;                       TRUE時, 支援奇偶檢驗。
     4) BYTE Parity;                                 奇偶檢驗位的設定
     5) BYTE StopBits;                             停止位的設定
2. 流控制(Flow Control) 的設定
     流控制分為硬體流控制和軟體流控制。 而硬體流控制又分為RTS/CTSDTR/DSR兩種。而軟體流控制, 則是Xon/Xoff 
     DTR/DSR 
硬體流控制:
     1) DWORD fOutxDsrFlow:1;            TRUE時,支援DSR流控制。 DSROFF時,停止傳送。
2) DWORD fDtrControl:2;                DTR設定。 (置高/置低...)   
     3) DWORD fDsrSensitivity:
1;           TRUE時,當DSROFF,則接收端忽略所有字元。  

     RTS/CTS 硬體流控制:
     4) DWORD fOutxCtsFlow:1;            TRUE時,支援CTS流控制。 CTSOFF時,停止傳送。
     5) DWORD fRtsControl:2;               RTS設定。 (置高/置低...)   

     Xon/Xoff 軟體流控制:
     6) DWORD fOutX: 1;                       傳送端支援Xon/Xoff
     7) DWORD fInX: 1;                         接收端支援Xon/Xoff
     8) WORD XonLim;                          當接收Buffer中的字元減少小XonLim規定的字元數, 就傳送Xon字元,讓對方繼續傳送。
     9) WORD XoffLim;                          接收Buffer達到XoffLim規定的字元數, 就傳送Xoff字元, 讓對方停止傳送。
     10)char XonChar;                          Xon 字元。
     11)char XoffChar;                          Xoff 字元。
     12)DWORD fTXContinueOnXoff:1TRUE時,不管接收端是否Xoff 本方傳送端持續傳送。 (也就是本方的傳送端, 與本方接收端Xon/Xoff是相互獨立的)。若為False 時,則當接收端buffer 達到XoffLim時,傳送端傳送完Xoff字元後,就停止傳送。
                   
3.  Error 情況處理
     1) DWORD fErrorChar: 1;              TRUE時,若fParityTRUE 則用ErrorChar替換Parity Check錯誤的字元。
     2) DWORD fAbortOnError:1;          TRUE時,發生錯誤時停止讀寫操作。
     3) char ErrorChar;                         Parity Check 錯誤時,替換的字元。
         
4. 其他引數
     1) DWORD DCBlength;                  DCB結構的長度(以位元組為單位)
     2) DWORD fBinary: 1;                   二進位制模式。(必須為1 )
     3) DWORD fNull: 1;                       TRUE時,接收時去掉空位元組(0x0)
     4) char EofChar;                           EOF替代字元
     5) char EvtChar;                           事件觸發字元
     6) DWORD fDummy2:17;              保留
     7) WORD wReserved;                  保留
     8) WORD wReserved1;                 保留

在WIN32  API程式設計中,除了DCB結構之外,還需要了解COMMTIMEOUTS結構.這個結構是為了讀寫串列埠的超時而設定的.

COMMTIMEOUTS結構如下:  
   
  typedef   struct   _COMMTIMEOUTS   {    
  DWORD   ReadIntervalTimeout;                 //任意相鄰連個字元之間的超時設定
  DWORD   ReadTotalTimeoutMultiplier;        //讀操作總的超時時間的係數
  DWORD   ReadTotalTimeoutConstant;       //讀操作總的超時時間的修正常量
  DWORD   WriteTotalTimeoutMultiplier;       //寫操作總的超時時間的係數
  DWORD   WriteTotalTimeoutConstant;       //寫操作總的超時時間的修正常量
  }   COMMTIMEOUTS,*LPCOMMTIMEOUTS;     
      
    
    ReadIntervalTimeout:兩相鄰字元之間最大的延時。當讀串列埠資料時,一旦兩個字元傳輸的時間間隔超過該時間,讀函式將返回現有的資料。設定為0表示該引數不起作用。    
   
    ReadTotalTimeoutMultiplier:讀操作總的超時事件的係數。 這個變數是不能單獨使用的。 必須和ReadTotalTimeoutConstant 一起使用才有效果。    
    
    ReadTotalTimeoutConstant:讀操作總的超時時間的修正常量。 這個變數也是不能單獨使用的。必須和ReadTotalTimeoutMultiplier一起使用才有效果。 
    
    WriteTotalTimeoutMultiplier:寫操作總的超時事件的係數。 這個變數是不能單獨使用的。 必須和WriteTotalTimeoutConstant 一起使用才有效果。   
    
    WriteTotalTimeoutConstant:寫操作總的超時時間的修正常量。 這個變數也是不能單獨使用的。必須和WriteTotalTimeoutMultiplier一起使用才有效果。

       在整個串列埠的讀寫操作中, 存在著兩種超時設定。一種是間隔超時, 一種是總超時。 這兩種超時是獨立存在,互不影響的。 

      間隔超時, 只在讀操作中存在。就是ReadIntervalTimeout。 當讀操作中,前後兩個字元之間的時間間隔超過時,讀操作就結束了。舉例來說,你一次讀取8個字元,但是在你讀取了第一個字元之後,在讀取第二個字元時,間隔超時了,那麼讀操作就結束了, 這樣整個操作就只讀取了1個位元組。 即使, 你的總時間沒有超時。 

       另一種超時,就是總超時。 這裡有一個公式。
       總的讀/寫超時時間 = Read(Write)TotalTimeoutMultiplier x 要讀/寫的位元組數 + Read(Write)TotalTimeoutConstant. 
       這裡要說明的一點,要讀/寫的位元組數是從哪裡來的。 這個是從ReadFile 或者WriteFile 函式中定義的。
       在讀操作時, 若當前所花讀取時間已經超過了總的超時設定, 則讀操作就結束了。即使, 每兩個字元之間的間隔沒有超時。 舉例來說, 若總共讀取8個位元組。 間隔設定為8ms, 總超時係數為3ms,總超時常數為3ms。 則總的超時時間為3*8+3=27ms。若每個字元讀取的間隔為7ms, 則這次操作總共能讀取4個字元。 就結束了。因為讀取第5個字元時, 已經需要35ms, 超過總超時時間了。

下面來討論一下這幾個引數的設定:
將ReadIntervalTimeout設定為MAXDWORD,將ReadTotalTimeoutMultiplier   和ReadTotalTimeoutConstant設定為0,表示讀操作將立即返回存放在輸入緩衝區的字元。  

將ReadIntervalTimeout設定為MAXDWORD,將ReadTotalTimeoutMultiplier   和ReadTotalTimeoutConstant設定為MAXDWORD, 表示讀操作會一直等待直到所需要讀取的位元組數全部接收到為止。 (大家可以把MAXDWORD 認為是永遠)

將ReadIntervalTimeout設定為0, 則不使用間隔超時, 只考慮總超時設定。