串口相关的API

串口编程详解
本文详细介绍了串口编程中涉及的重要函数,包括SetCommMask、SetCommState、WaitCommEvent、GetOverlappedResult、ClearCommError等,并解释了它们的作用及参数意义。
指定一组监视通信设备的事件
原型: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Car12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值