我把电脑串口的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);

}

解决方案 »

  1.   

    单独发一个byte呢?是否还是两次?
      

  2.   

    你怎么读的串口? 估计你是按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个参数,就是设置按字节数接收
      

  3.   

    TO:lfchen 
    单独发一个字节,只接收到一次EV_RXCHAR事件.
    但是我只要发>=2个字节就会收到两次EV_RXCHAR,
    但是我也不是一次读取一个字节,我是一次读取所有字节:代码如下:
    ClearCommError(hReadCom,&dwErrorFlags,&ComStat);
    ReadFile(hReadCom,buffer,ComStat.cbInQue,&BytesTransferred, &Ovlap);根据ClearCommError获取的接收缓冲区长度来获取的.一次就接收完所有数据,但为什么会发生
    两次EV_RXCHAR事件呢?????
      

  4.   

    也许是字节间超时了,导致多次中断
    TIMEOUTS参数的字节间超时设置的大一些试试看。
      

  5.   

    TimeOuts.ReadIntervalTimeout=MAXDWORD;
    TimeOuts.ReadTotalTimeoutMultiplier=1000;        //超时设置,单位=毫秒
    TimeOuts.ReadTotalTimeoutConstant=5000;
    把超时设置更大还是一样的,会发生两次EV_RXCHAR事件.
      

  6.   

    其实只需在串口读线程中小小延时一下就可以了。因为串口发送数据的速度没有CPU读串口数据的速度快。串口收到数据时触发串口接收事件,然后被读走了,而串口数据还没完全到达,则后来的数据到达时又再触发一次接收事件,再读一次。加上小小延时等串口数据完全到达之后再读走就可以了
      

  7.   

    我试过你的方法 还是有同样的问题  不知道这个是什么原因  串口数据还没到达之前CPU怎么提取数据?不会吧