SetCommMask

By admin in 计算机教程 on 2019年11月16日

Global Const MSCOMM_EV_CTS = 3

 

Global Const MSCOMM_ER_BREAK = 1001

  EV_CTS:CTS(clear to send)线路发生变化。

Case MSCOMM_ER_TXFULL
插入处理发送缓冲器满代码

  EV_TXEMPTY:输出缓冲区中的数据已被完全送出。

Case MSCOMM_EV_CTS 插入处理CTS信号改变代码

  EV_ERR:线路状态错误,包括了CE_FRAME / CE_OVERRUN / CE_RXPARITY
3种错误。

Global Const MSCOMM_ER_CDTO = 1007

 

Global Const MSCOMM_ER_OVERRUN = 1006

        用途:设置串口通信事件

Case MSCOMM_ER_CDTO 插入处理CD(RLSD)超时代码

  原型:BOOL SetCommMask(HANDLE hFile, //标识通信端口的句柄

Global Const MSCOMM_ER_CTSTO = 1002

 

Global Const MSCOMM_EV_RING = 6

  EV_DSR:DST(Data Set Ready)线路发生变化。

Global Const MSCOMM_EV_RECEIVE = 2

 

Global Const MSCOMM_ER_DSRTO = 1003

  EV_RING:检测到振铃信号。

Case MSCOMM_ER_DSRTO 插入处理DSR超时代码

等待各种事件的发生(比如发送数据单击事件,更改通信参数事件,监视线程发来的消息等)

监视线程被打开
|
|
V
串口事件发生否(WaitCommEvent())(无论发生否均进入下面的代码)
|
|
V
异步操作是否正在后台进行?(if(GetLastError()==ERROR_IO_PENDING))
|
|
V
在此等待异步操作结果(GetOverlappedResult(hComm,&os,&dwTrans,true))
|
|
V
处理通信事件,根据事件类型的不同给主窗体发送不同的消息

总结起来说SetCommMask()和WaitCommEvent()是要成对使用的。在串口打开的时候SetCommMask,然后在读数据的线程中WaitCommEvent。不过要注意的是,一般不会在WaitCommEvent之后做关于该串口数据的处理(尤其是在数据比较多,处理缓慢的时候——容易丢失数据吧~~),一般会把数据简单的保存下来,再发送消息给一个专门的处理函数进行处理。

Case MSCOMM_ER_BREAK 插入处理BREAK代码

 

Case MSCOMM_ER_RXPARITY 插入处理校验错误代码

 

Global Const MSCOMM_ER_RXOVER = 1008

  参数说明:-hFile:串口句柄

 

 

我们可通讯取得MSCOMM1.INPUT中的内容可检测是否已建立好联系。建立好联系和中断联系MSCOMM1的ONCOMM事件会产生一个定义好的MSCOMM_EV_CD消息,在对该消息的处理中也可检测通讯的好与坏。

操作举例:SetCommMask(hComm,EV_RXCHAR|EV_TXEMPTY);

 

 


 

msgbox”CD_CHANGE”

  

Case MSCOMM_EV_CD 插入处理CD信号改变代码

memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!WaitCommEvent(hComm,&dwMask,&os)){
//如果异步操作不能立即完成的话,函数返回FALSE,并且调用GetLastError()函
//数分析错误原因后返回ERROR_IO_PENDING,指示异步操作正在后台进行.这种情
//况下,在函数返回之前系统设置OVERLAPPED结构中的事件为无信号状态,该函数
//等待用SetCommMask()函数设置的串口事件发生,共有9种事件可被监视:
//EV_BREAK,EV_CTS,EV_DSR,EV_ERR,EV_RING,EV_RLSD,EV_RXCHAR,
//EV_RXFLAG,EV_TXEMPTY;当其中一个事件发生或错误发生时,函数将
//OVERLAPPED结构中的事件置为有信号状态,并将事件掩码填充到dwMask参数中

if(GetLastError()==ERROR_IO_PENDING){
/**************************************************************/
/*在此等待异步操作结果,直到异步操作结束时才返回.实际上此时 */
/*WaitCommEvent()函数一直在等待串口监控的事件之一发生,当事件发*/
/*生时该函数将OVERLAPPED结构中的事件句柄置为有信号状态,此时 */
/*GetOverlappedResult()函数发现此事件有信号后马上返回,然后下面*/
/*的程序马上分析WaitCommEvent()函数等到的事件是被监视的串口事 */
/*件中的哪一个,然后执行相应的动作并发出相应消息. */
/**************************************************************/
GetOverlappedResult(hComm,&os,&dwTrans,true);
switch(dwMask){
case EV_RXCHAR:
PostMessage(Parent,WM_COMM_RXCHAR,0,0);
break;
case EV_TXEMPTY:
PostMessage(Parent,WM_COMM_TXEMPTY,0,0);
break;
case EV_ERR:
switch(dwError){
case CE_FRAME:
err=0;
break;
case CE_OVERRUN:
err=1;
break;
case CE_RXPARITY:
err=2;
break;
default:break;
}
PostMessage(Parent,WM_COMM_ERR,(WPARAM)0,(LPARAM)err);
break;
case EV_BREAK:
PostMessage(Parent,WM_COMM_BREAK,0,0);
break;
case …://其他用SetCommMask()函数设置的被监视的串口通信事件。
… …
break;
default:break;
}
}

Global Const MSCOMM_ER_RXPARITY = 1009

参数含义:

Case MSCOMM_EV_SEND
插入处理发送缓冲器中的字符数低于设定的数值时产生该事件的代码

 

Global Const MSCOMM_EV_SEND = 1

  EV_RXFLAG:使用SetCommState()函数设置的DCB结构中的等待字符已被传入输入缓冲区中。

在通过MODEM建立好联系后,MODEM会返回“CONNECT 9600”消息,其中9600表示所建立的波特率。如果没有建立好通讯MODEM会返回“BUSY”。

  EV_BREAK:收到BREAK信号。

Case MSCOMM_ER_RXOVER
插入处理接收缓冲器溢出代码

WaitCommEvent()
用途:用来判断用SetCommMask()函数设置的串口通信事件是否已发生。
原型:BOOL WaitCommEvent(HANDLE hFile,
LPDWORD lpEvtMask,
LPOVERLAPPED lpOverlapped
);
参数说明:
-hFile:串口句柄
-lpEvtMask:函数执行完后如果检测到串口通信事件的话就将其写入该参数中。
-lpOverlapped:异步结构,用来保存异步操作结果。
操作举例:OVERLAPPED os;
DWORD dwMask,dwTrans,dwError=0,err;

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 澳门金沙30064在线网站 版权所有