串口通讯编程一日通3(COMMTIMEOUTS DCB整理)
上一篇看了Overlapped IO模型后,接下來看剩下兩個重要結構:
?
?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 control
   TRUE時,接收到XoffChar之后便停止發送
   接收到XonChar之后將重新開始
   DWORD fInX: 1; // XON/XOFF in flow control
   TRUE時,接收緩沖區接收到代表緩沖區滿的XoffLim之后,XoffChar發送出去
   接收緩沖區接收到代表緩沖區空的XonLim之后,XonChar發送出去
   DWORD fErrorChar: 1; // enable error replacement
   該值為TRUE且fParity為TRUE時,用ErrorChar 成員指定的字符代替奇偶校驗錯誤的接收字符
   DWORD fNull: 1; // enable null stripping
   TRUE時,接收時去掉空(0值)字節
   DWORD fRtsControl:2; // RTS flow control
   RTS_CONTROL_DISABLE時,RTS置為OFF
   RTS_CONTROL_ENABLE時, RTS置為ON
   RTS_CONTROL_HANDSHAKE時,
   當接收緩沖區小于半滿時RTS為ON
   當接收緩沖區超過四分之三滿時RTS為OFF
   RTS_CONTROL_TOGGLE時,
   當接收緩沖區仍有剩余字節時RTS為ON ,否則缺省為OFF
   DWORD fAbortOnError:1; // abort reads/writes on error
   TRUE時,有錯誤發生時中止讀和寫操作
   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 未使用
   } DCB;
總結
以上是生活随笔為你收集整理的串口通讯编程一日通3(COMMTIMEOUTS DCB整理)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 红旗H9事故冲下30多米悬崖 气囊一个未
- 下一篇: 18.16万起售 smart精灵#1上市
