串口通信,设置WaitCommEvent等待EV_RXCHAR事件为什么会发生2次.

yanjinbin0 2009-05-09 02:32:19
我把电脑串口的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);
}
}
...全文
815 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zc263316 2012-03-16
  • 打赏
  • 举报
回复
我试过你的方法 还是有同样的问题 不知道这个是什么原因 串口数据还没到达之前CPU怎么提取数据?不会吧
kenlinwk 2011-07-19
  • 打赏
  • 举报
回复
其实只需在串口读线程中小小延时一下就可以了。因为串口发送数据的速度没有CPU读串口数据的速度快。串口收到数据时触发串口接收事件,然后被读走了,而串口数据还没完全到达,则后来的数据到达时又再触发一次接收事件,再读一次。加上小小延时等串口数据完全到达之后再读走就可以了
一条晚起的虫 2009-05-12
  • 打赏
  • 举报
回复
也许是字节间超时了,导致多次中断
TIMEOUTS参数的字节间超时设置的大一些试试看。
yanjinbin0 2009-05-12
  • 打赏
  • 举报
回复
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=1000; //超时设置,单位=毫秒
TimeOuts.ReadTotalTimeoutConstant=5000;
把超时设置更大还是一样的,会发生两次EV_RXCHAR事件.
yanjinbin0 2009-05-12
  • 打赏
  • 举报
回复
串口这东西还是比较复杂的啊.
搞不清楚为什么会完成两次???
yanjinbin0 2009-05-12
  • 打赏
  • 举报
回复
在小小的UP下.
yanjinbin0 2009-05-11
  • 打赏
  • 举报
回复
TO:lfchen
单独发一个字节,只接收到一次EV_RXCHAR事件.
但是我只要发>=2个字节就会收到两次EV_RXCHAR,
但是我也不是一次读取一个字节,我是一次读取所有字节:

代码如下:
ClearCommError(hReadCom,&dwErrorFlags,&ComStat);
ReadFile(hReadCom,buffer,ComStat.cbInQue,&BytesTransferred, &Ovlap);

根据ClearCommError获取的接收缓冲区长度来获取的.一次就接收完所有数据,但为什么会发生
两次EV_RXCHAR事件呢?????
caitian6 2009-05-11
  • 打赏
  • 举报
回复
你怎么读的串口? 估计你是按1字节读的串口
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个参数,就是设置按字节数接收
一条晚起的虫 2009-05-11
  • 打赏
  • 举报
回复
单独发一个byte呢?是否还是两次?
yanjinbin0 2009-05-11
  • 打赏
  • 举报
回复
小小的UP下。

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧