我把电脑串口的2脚和3脚连接在连在一起(收到数据立刻返回).设置WaitCommEvent等待EV_RXCHAR事件时,但是如果我发送一次数据就立刻会看到发生两次EV_RXCHAR事件.搞不清楚为什么会发生两次读取事件???
一个侦听串口所有事件线程代码如下:
/*等待串口事件线程*/
UINT WINAPI WaitEventFunc(LPVOID lpParam)
{
HANDLE hEventCom = (HANDLE)lpParam; /*串口句柄*/
DWORD dwEventMask=0; /*发生的事件*/
OVERLAPPED Ovlap; ZeroMemory(&Ovlap, sizeof(OVERLAPPED));
Ovlap.hEvent = g_EventEvent;
if(!WaitCommEvent(hEventCom,&dwEventMask,&Ovlap)){
if(SHOWERROR_NumF(ERROR_IO_PENDING)){
printf("Event:出错\n");
}
}
while(TRUE){
WaitForSingleObject(Ovlap.hEvent,INFINITE);
ResetEvent(Ovlap.hEvent);
switch(dwEventMask)
{
case EV_BREAK:
/*向主线程发送端口中断消息*/
printf("Event:向主线程发送端口中断消息\n");
break;
case EV_CTS:
printf("Event:CTS信号发生变化\n");
break;
case EV_DSR:
/*向主线程发送端口状态消息*/
printf("Event:向主线程发送端口状态消息\n");
break;
case EV_ERR:
/*向主线程发送端口错误消息*/
printf("Event:向主线程发送端口错误消息\n");
break;
case EV_RXFLAG:
/*向主线程发送接收特殊字符消息,通知主线程读*/
printf("Event:读取特殊字符\n");
break;
case EV_RXCHAR:
/*向主线程发送接收字符消息,通知主线程读*/
printf("Event:读取字符\n");
break;
case EV_TXEMPTY:
/*向主线程发送数据已发送消息*/
printf("Event:数据已发送\n");
break;
}
WaitCommEvent(hEventCom,&dwEventMask,&Ovlap);
}
}
一个侦听串口所有事件线程代码如下:
/*等待串口事件线程*/
UINT WINAPI WaitEventFunc(LPVOID lpParam)
{
HANDLE hEventCom = (HANDLE)lpParam; /*串口句柄*/
DWORD dwEventMask=0; /*发生的事件*/
OVERLAPPED Ovlap; ZeroMemory(&Ovlap, sizeof(OVERLAPPED));
Ovlap.hEvent = g_EventEvent;
if(!WaitCommEvent(hEventCom,&dwEventMask,&Ovlap)){
if(SHOWERROR_NumF(ERROR_IO_PENDING)){
printf("Event:出错\n");
}
}
while(TRUE){
WaitForSingleObject(Ovlap.hEvent,INFINITE);
ResetEvent(Ovlap.hEvent);
switch(dwEventMask)
{
case EV_BREAK:
/*向主线程发送端口中断消息*/
printf("Event:向主线程发送端口中断消息\n");
break;
case EV_CTS:
printf("Event:CTS信号发生变化\n");
break;
case EV_DSR:
/*向主线程发送端口状态消息*/
printf("Event:向主线程发送端口状态消息\n");
break;
case EV_ERR:
/*向主线程发送端口错误消息*/
printf("Event:向主线程发送端口错误消息\n");
break;
case EV_RXFLAG:
/*向主线程发送接收特殊字符消息,通知主线程读*/
printf("Event:读取特殊字符\n");
break;
case EV_RXCHAR:
/*向主线程发送接收字符消息,通知主线程读*/
printf("Event:读取字符\n");
break;
case EV_TXEMPTY:
/*向主线程发送数据已发送消息*/
printf("Event:数据已发送\n");
break;
}
WaitCommEvent(hEventCom,&dwEventMask,&Ovlap);
}
}
解决方案 »
- 完成端口服务端发送数据的问题?
- 很久以前写的一个时钟,一直静静的躺在硬盘里放出来吓吓人。编译出来5.5kb没有用图片。全自绘。大家去其糟粕,取其精华。
- 请教: 如何实现按一次键,改变一下对话框的背景色??
- 紧急求助,对一个PPT文件解密,分不是问题
- 这问题有点难度
- 如何实现工具栏的自动伸缩?
- <急急急300分加急求助>锁定远程计算机(WIN2000)屏幕
- 各位高手:请问有没有区分固定硬盘和移动硬盘的函数给100分
- 聘:软件工程师
- windows下字符的宽度
- 用户登录程序问题
- BMP位图显示unhandled exception in MDI.exe(gdi32.dll):0xc0000005:Access violation
bResult = ReadFile(port->m_hComm, // Handle to COMM port
&RXBuff, // RX Buffer Pointer
1, // Read one byte
&BytesRead, // Stores number of bytes read
&port->m_ov); // pointer to the m_ov structure 第3个参数,就是设置按字节数接收
单独发一个字节,只接收到一次EV_RXCHAR事件.
但是我只要发>=2个字节就会收到两次EV_RXCHAR,
但是我也不是一次读取一个字节,我是一次读取所有字节:代码如下:
ClearCommError(hReadCom,&dwErrorFlags,&ComStat);
ReadFile(hReadCom,buffer,ComStat.cbInQue,&BytesTransferred, &Ovlap);根据ClearCommError获取的接收缓冲区长度来获取的.一次就接收完所有数据,但为什么会发生
两次EV_RXCHAR事件呢?????
TIMEOUTS参数的字节间超时设置的大一些试试看。
TimeOuts.ReadTotalTimeoutMultiplier=1000; //超时设置,单位=毫秒
TimeOuts.ReadTotalTimeoutConstant=5000;
把超时设置更大还是一样的,会发生两次EV_RXCHAR事件.