指定一组监视通信设备的事件
原型:BOOL SetCommMask(HANDLE hFile, //标识通信端口的句柄
DWORD dwEvtMask //能够使能的通信事件
);
参数说明:-hFile:串口句柄
-dwEvtMask:准备监视的串口事件掩码
串口上可能发生的事件如下表所示:
值
事件描述
EV_BREAK
A break was detected on input.
EV_CTS
The CTS (clear-to-send) signal changed state.
EV_DSR
The DSR(data-set-ready) signal changed state.
EV_ERR
A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY.
EV_RING
A ring indicator was detected.
EV_RLSD
The RLSD (receive-line-signal-detect) signal changed state.
EV_RXCHAR
A character was received and placed in the input buffer.
EV_RXFLAG
The event character was received and placed in the input buffer. The event character is specified in the device's DCB structure, which is applied to a serial port by using the SetCommState
function.
EV_TXEMPTY
The last character in the output buffer was sent.
参数含义编辑
EV_BREAK:收到BREAK信号。
EV_CTS:CTS(clear to send)线路发生变化。
EV_DSR:DST(Data Set Ready)线路发生变化。
EV_ERR:线路状态错误,包括了CE_FRAME / CE_OVERRUN / CE_RXPARITY 3种错误。
EV_RING:检测到振铃信号。
EV_RLSD:CD(Carrier Detect)线路信号发生变化。
EV_RXCHAR:输入缓冲区中已收到数据,即接收到一个字节并放入输入缓冲区。
EV_RXFLAG:使用SetCommState()函数设置的DCB结构中的等待字符已被传入输入缓冲区中。
EV_TXEMPTY:输出缓冲区中的数据已被完全送出。
另外,可以通过SetCommMask(hFile,0)来清除该通讯设备的所有事件
------------------------------------------------------------------------------------------------------------------------------------------------
SetCommState编辑
函数作用:设置串口设置(波特率,校验,停止位,数据位等).
函数设置COM口的设备控制块:
BOOL SetCommState(
HANDLE hFile,
LPDCB lpDCB
);
参数说明:
SetCommState函数的第一个参数hFile是由CreateFile函数返回指向已打开串行口的句柄。第二个参数指向设备控制块DCB。如果函数调用成功,则返回值为非0;若函数调用失败,则返回值为0。
串口编程里COMSTAT结构
COMSTAT结构
COMSTAT结构包含串口的信息,结构定义如下:
typedef struct _COMSTAT { // cst
DWORD fCtsHold : 1; // Tx waiting for CTS signal RTS (request to send) 请求发送 CTS (Clear to send) 允许发送, 很多文章翻译成 清除发送, 是不正确的.数据准备就绪,是RS232中的一
握手信号。当调制/解调器启动时,在经过自身检测后,用DSR来声明已经准备就绪。
DWORD fDsrHold : 1; // Tx waiting for DSR signal
DWORD fRlsdHold : 1; // Tx waiting for RLSD signal
DWORD fXoffHold : 1; // Tx waiting, XOFF char rec''d
DWORD fXoffSent : 1; // Tx waiting, XOFF char sent
DWORD fEof : 1; // EOF character sent
DWORD fTxim : 1; // character waiting for Tx
DWORD fReserved : 25; // reserved
DWORD cbInQue; // bytes in input buffer该成员变量的值代表输入缓冲区的字节数
DWORD cbOutQue; // bytes in output buffer 输出缓冲区中的字节数(这部分的缓冲区是在函数 setupcom 设定的缓冲区大小,属于软件buffer)
} COMSTAT, *LPCOMSTAT;
------------------------------------------------------------------------------------------------------------------------------------------------
BOOL WINAPI WaitCommEvent(
__in HANDLEhFile,
__out LPDWORDlpEvtMask,
__in LPOVERLAPPEDlpOverlapped
);
作用:为一个特指的通信设备等待一个事件发生,该函数所监控的事件是与该设备句柄相关联的一系列事件。
hFile:指向通信设备的一个句柄,该句柄应该是由 CreateFile函数返回的。
lpEvtMask:一个指向DWORD的指针。
EV_BREAK:收到BREAK信号。
EV_CTS:CTS(clear to send)线路发生变化。
EV_DSR:DST(Data Set Ready)线路发生变化。
EV_ERR:线路状态错误,包括了CE_FRAME / CE_OVERRUN / CE_RXPARITY 3种错误。
EV_RING:检测到振铃信号。
EV_RLSD:CD(Carrier Detect)线路信号发生变化。
EV_RXCHAR:输入缓冲区中已收到数据,即接收到一个字节并放入输入缓冲区。
EV_RXFLAG:使用SetCommState()函数设置的DCB结构中的等待字符已被传入输入缓冲区中。
EV_TXEMPTY:输出缓冲区中的数据已被完全送出
lpOverlapped:指向OVERLAPPED结构体的一个指针。如果hFile是用异步方式打开的(在CreateFile()函数中,第三个参数设置为FILE_FLAG_OVERLAPPED),lpOverlapped不能指向一个空
OVERLAPPED结构体,而是与Readfile()和WriteFile()中的OVERLAPPED参数为同一个参数。如果hFile是用异步方式打开的,而lpOverlapped指向一个空的OVERLAPPED结构体,那么函数
会错误地报告,等待的操作已经完成(而此时等待的操作可能还没有完成)。
如果hFile是用异步方式打开的,而lpOverlapped指向一个非空的OVERLAPPED结构体,那么函数WaitCommEvent被默认为异步操作,马上返回。这时,OVERLAPPED结构体必须包含一个由
CreateEvent()函数返回的手动重置事件对象的句柄hEven。
如果hFile是用同步方式打开的,那么函数WaitCommEvent不会返回,直到要等待的事件发生。
WaitCommEvent函数为指定的通信资源监听一系列的Event,这些Event可以由SetcommMask和GetcommMask函数来设置和查询。
如果异步操作不能马上完成,那么该函数会返回一个FALSE,同时GetLastError函数可以截获错误码ERROR_IO_PENDING(#define ERROR_IO_PENDING 997),表示操作转到后台运行。在
WaitCommEvent函数返回之前,系统将OVERLAPPED结构中的hEven句柄设置为无信号状态;当WaitCommEvent函数所等待的任何一个Event发生后,系统将OVERLAPPED结构中的hEven句柄设
置为有信号状态,同时将所发生事件赋给lpEvtMask。
父进程可以根据lpEvtMask来做出相应的事件处理,然后也可以调用GetOverlappedResult函数来判断WaitCommEvent的操作是否成功。
如果WaitCommEvent函数在后台运行的时候,进程企图想通过SetcommMask函数来改变当前设备的Event,那么WaitCommEvent函数马上返回,lpEvtMask指向0。
----------------------------------------------------------------------------------------------------------------------------------------------------------
BOOL GetOverlappedResult(
HANDLE hFile, // 串口的句柄
// 指向重叠操作开始时指定的OVERLAPPED结构
LPOVERLAPPED lpOverlapped,
// 指向一个32位变量,该变量的值返回实际读写操作传输的字节数。
LPDWORD lpNumberOfBytesTransferred,
// 该参数用于指定函数是否一直等到重叠操作结束。
// 如果该参数为TRUE,函数直到操作结束才返回。
// 如果该参数为FALSE,函数直接返回,这时如果操作没有完成,
// 通过调用GetLastError()函数会返回ERROR_IO_INCOMPLETE。
BOOL bWait
);
----------------------------------------------------------------------------------------------------------------------------------------------------------
BOOL ClearCommError(
HANDLE hFile,
LPDWORD lpErrors,
LPCOMSTAT lpStat
);
第一个参数hFile是由CreateFile函数返回指向已打开串行口的句柄。
第二个参数指向定义了错误类型的32位变量。
第三个参数指向一个返回设备状态的控制块COMSTAT。如
果函数调用成功,则返回值为非0;若函数调用失败,则返回值为0