拿走不謝: WIN32 API 中串列埠DCB 結構
|
sizeof(DCB) |
|
current baud rate 指定當前的波特率 |
|
binary mode, no EOF check 指定是否允許二進位制模式WIN95中須為TRUE |
|
enable parity checking 指定奇偶校驗是否允許 |
|
CTS output flow control 指定CTS是否用於檢測傳送控制。當為TRUE時CTS為 // OFF,傳送將被掛起。(傳送清楚) |
|
DSR output flow control指定CTS是否用於檢測傳送控制。(資料裝備好)當為TRUE是CTS為OFF,傳送將被掛起。 |
|
DTR flow control type //DTR_CONTROL_DISABLE值將DTR置為OFF, //DTR_CONTROL_ENABLE //DTR_CONTROL_HANDSHAKE 允許DTR"握手 |
|
DSR sensitivity 當該值為TRUE時DSR為OFF時接收的位元組被忽略 |
|
XOFF continues Tx 指定當接收緩衝區已滿,並且驅動程式已經發送出XoffChar字元時傳送是否停止。 TRUE時,在接收緩衝區接收到緩衝區已滿的位元組XoffLim且驅動程式已經發送出XoffChar FALSE時,在接收緩衝區接收到代表緩衝區已空的位元組XonChar且驅動程式已經發送出恢復傳送的XonChar之後,傳送繼續進行。 |
|
XON/XOFF out flow control //TRUE時,接收到XoffChar之後便停止傳送 //FALSE時,接收到XonChar之後將重新開始 |
|
// XON/XOFF in flow control TRUE時,接收緩衝區接收到代表緩衝區滿的XoffLim之後,XoffChar傳送出去 接收緩衝區接收到代表緩衝區空的XonLim之後,XonChar傳送出去 |
|
// enable error replacement |
|
// enable null stripping TRUE時,接收時去掉空(0值)位元組 |
|
RTS flow control |
|
abort reads/writes on error TRUE時,有錯誤發生時中止讀和寫操作 |
|
reserved 未使用 |
|
not currently used 未使用,必須為0 |
|
// transmit XON threshold |
|
// transmit XOFF threshold |
|
number of bits/byte, 4-8 指定埠當前使用的資料位 |
|
// 0-4=no,odd,even,mark,space 指定埠當前使用的奇偶校驗方法,可能為: |
|
0,1,2 = 1, 1.5, 2 指定埠當前使用的停止位數,可能為: |
|
// Tx and Rx XON character 指定用於傳送和接收字元XON的值 |
|
Tx and Rx XOFF character 指定用於傳送和接收字元XOFF值 |
|
// error replacement character本字元用來代替接收到的奇偶校驗發生錯誤時的值 |
|
// end of input character 當沒有使用二進位制模式時,本字元可用來指示資料的結束 |
|
// received event character 當接收到此字元時,會產生一個事件 |
|
// 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/CTS和DTR/DSR兩種。而軟體流控制, 則是Xon/Xoff。
DTR/DSR 硬體流控制:
1) DWORD fOutxDsrFlow:1; TRUE時,支援DSR流控制。 當DSR為OFF時,停止傳送。
2) DWORD fDtrControl:2; DTR設定。 (置高/置低...)
3) DWORD fDsrSensitivity:1; TRUE時,當DSR為OFF,則接收端忽略所有字元。
RTS/CTS 硬體流控制:
4) DWORD fOutxCtsFlow:1; TRUE時,支援CTS流控制。 當CTS為OFF時,停止傳送。
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:1; TRUE時,不管接收端是否Xoff, 本方傳送端持續傳送。 (也就是本方的傳送端, 與本方接收端Xon/Xoff是相互獨立的)。若為False 時,則當接收端buffer 達到XoffLim時,傳送端傳送完Xoff字元後,就停止傳送。
3. Error 情況處理
1) DWORD fErrorChar: 1; TRUE時,若fParity為TRUE, 則用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, 則不使用間隔超時, 只考慮總超時設定。