上一篇看了Overlapped IO模型后,接下來看剩下兩個重要結(jié)構(gòu):
2.COMMTIMEOUTS結(jié)構(gòu) 超時設(shè)置
COMMTIMEOUTS:COMMTIMEOUTS主要用于串口超時參數(shù)設(shè)置。COMMTIMEOUTS結(jié)構(gòu)如下:
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; //讀間隔超時
DWORD ReadTotalTimeoutMultiplier;// 讀時間系數(shù)
DWORD ReadTotalTimeoutConstant; // 讀時間常量
DWORD WriteTotalTimeoutMultiplier; // 寫時間系數(shù)
DWORD WriteTotalTimeoutConstant; // 寫時間常量
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
ReadIntervalTimeout:兩字符之間最大的延時,,當(dāng)讀取串口數(shù)據(jù)時,一旦兩個字符傳輸?shù)臅r間差超過該時間,,讀取函數(shù)將返回現(xiàn)有的數(shù)據(jù),。設(shè)置為0表示該參數(shù)不起作用。
ReadTotalTimeoutMultiplier:讀取每字符間的超時,。
ReadTotalTimeoutConstant:一次讀取串口數(shù)據(jù)的固定超時,。所以在一次讀取串口的操作中,其超時為ReadTotalTimeoutMultiplier乘以讀取的字節(jié)數(shù)再加上 ReadTotalTimeoutConstant,。將ReadIntervalTimeout設(shè)置為MAXDWORD,,并將ReadTotalTimeoutMultiplier 和ReadTotalTimeoutConstant設(shè)置為0,表示讀取操作將立即返回存放在輸入緩沖區(qū)的字符,。
WriteTotalTimeoutMultiplier:寫入每字符間的超時,。
WriteTotalTimeoutConstant:一次寫入串口數(shù)據(jù)的固定超時。所以在一次寫入串口的操作中,,其超時為WriteTotalTimeoutMultiplier乘以寫入的字節(jié)數(shù)再加上 WriteTotalTimeoutConstant,。
一般都會做以下設(shè)置:
TimeOuts.ReadIntervalTimeout=MAXDWORD;
// 把間隔超時設(shè)為最大,把總超時設(shè)為0將導(dǎo)致ReadFile立即返回并完成操作
TimeOuts.ReadTotalTimeoutMultiplier=0;
//讀時間系數(shù)
TimeOuts.ReadTotalTimeoutConstant=0;
//讀時間常量
TimeOuts.WriteTotalTimeoutMultiplier=50;
//總超時=時間系數(shù)*要求讀/寫的字符數(shù)+時間常量
TimeOuts.WriteTotalTimeoutConstant=2000;
//設(shè)置寫超時以指定WriteComm成員函數(shù)中的
3.DCB結(jié)構(gòu)
DCB (Device Control Block) 設(shè)備控制塊
在打開通訊串口后,,我們需要對串口進行初始化,,比如,波特率,、奇偶位,、校驗位等,在查詢或者配置這些數(shù)據(jù)時,,都要用DCB進行緩沖,,可以調(diào)用GetcommState函數(shù)獲得當(dāng)前串口配置,以下是DCB的具體成員:
typedef struct _DCB {// dcb
DWORD DCBlength; // sizeof(DCB)
DWORD BaudRate; // current baud rate
指定當(dāng)前的波特率
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是否用于檢測發(fā)送控制,。
當(dāng)為TRUE是CTS為OFF,發(fā)送將被掛起,。
DWORD fOutxDsrFlow:1; // DSR output flow control
指定CTS是否用于檢測發(fā)送控制,。
當(dāng)為TRUE是CTS為OFF,發(fā)送將被掛起,。
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 當(dāng)該值為TRUE時DSR為OFF時接收的字節(jié)被忽略
DWORD fTXContinueOnXoff:1; // XOFF continues Tx
指定當(dāng)接收緩沖區(qū)已滿,并且驅(qū)動程序已經(jīng)發(fā)
送出XoffChar字符時發(fā)送是否停止,。
TRUE時,在接收緩沖區(qū)接收到緩沖區(qū)已滿的字節(jié)XoffLim且驅(qū)動程序已經(jīng)發(fā)送出XoffChar字符中止接收字節(jié)之后,發(fā)送繼續(xù)進行,。
FALSE時,,在接收緩沖區(qū)接收到代表緩沖區(qū)已空的字節(jié)XonChar且驅(qū)動程序已經(jīng)發(fā)送出恢復(fù)發(fā)送的XonChar之后,發(fā)送繼續(xù)進行,。
DWORD fOutX: 1; // XON/XOFF out flow control
TRUE時,,接收到XoffChar之后便停止發(fā)送
接收到XonChar之后將重新開始
DWORD fInX: 1; // XON/XOFF in flow control
TRUE時,接收緩沖區(qū)接收到代表緩沖區(qū)滿的XoffLim之后,,XoffChar發(fā)送出去
接收緩沖區(qū)接收到代表緩沖區(qū)空的XonLim之后,,XonChar發(fā)送出去
DWORD fErrorChar: 1; // enable error replacement
該值為TRUE且fParity為TRUE時,用ErrorChar 成員指定的字符代替奇偶校驗錯誤的接收字符
DWORD fNull: 1; // enable null stripping
TRUE時,,接收時去掉空(0值)字節(jié)
DWORD fRtsControl:2; // RTS flow control
RTS_CONTROL_DISABLE時,RTS置為OFF
RTS_CONTROL_ENABLE時, RTS置為ON
RTS_CONTROL_HANDSHAKE時,
當(dāng)接收緩沖區(qū)小于半滿時RTS為ON
當(dāng)接收緩沖區(qū)超過四分之三滿時RTS為OFF
RTS_CONTROL_TOGGLE時,
當(dāng)接收緩沖區(qū)仍有剩余字節(jié)時RTS為ON ,否則缺省為OFF
DWORD fAbortOnError:1; // abort reads/writes on error
TRUE時,有錯誤發(fā)生時中止讀和寫操作
DWORD fDummy2:17; // reserved
未使用
WORD wReserved; // not currently used
未使用,必須為0
WORD XonLim; // transmit XON threshold
指定在XON字符發(fā)送這前接收緩沖區(qū)中可允許的最小字節(jié)數(shù)
WORD XoffLim; // transmit XOFF threshold
指定在XOFF字符發(fā)送這前接收緩沖區(qū)中可允許的最小字節(jié)數(shù)
BYTE ByteSize; // number of bits/byte, 4-8
指定端口當(dāng)前使用的數(shù)據(jù)位
BYTE Parity; // 0-4=no,odd,even,mark,space
指定端口當(dāng)前使用的奇偶校驗方法,可能為:
EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY
BYTE StopBits; // 0,1,2 = 1, 1.5, 2
指定端口當(dāng)前使用的停止位數(shù),可能為:
ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS
char XonChar; // Tx and Rx XON character
指定用于發(fā)送和接收字符XON的值
char XoffChar; // Tx and Rx XOFF character
指定用于發(fā)送和接收字符XOFF值
char ErrorChar; // error replacement character
本字符用來代替接收到的奇偶校驗發(fā)生錯誤時的值
char EofChar; // end of input character
當(dāng)沒有使用二進制模式時,本字符可用來指示數(shù)據(jù)的結(jié)束
char EvtChar; // received event character
當(dāng)接收到此字符時,會產(chǎn)生一個事件
WORD wReserved1; // reserved; do not use 未使用
} DCB;