我使用异步通信,一下是我等待事件的代码,在一个线程中使用BOOL WaitEventChar()
{
   OVERLAPPED  os ; 
   DWORD       dwEvtMask,Errors;
   COMSTAT Stat;   memset( &os, 0, sizeof( OVERLAPPED ));
   os.hEvent = CreateEvent( NULL,    // no security
                            TRUE,    // explicit reset req
                           FALSE,   // initial event nonsignaled. 
                           NULL ) ; // no name
   dwEvtMask = 0 ;
   WaitCommEvent(idComDev,&dwEvtMask,&os);
   if (WaitForSingleObject(os.hEvent,MAXTIMEOUT)==WAIT_TIMEOUT)
   {
     CloseHandle(os.hEvent);
   return false;
   }
   else if ((dwEvtMask & EV_RXFLAG) == EV_RXFLAG)
   {
       CloseHandle(os.hEvent);
   
   ClearCommError(idComDev,&Errors, &Stat);
   return true;
}else
{
     CloseHandle(os.hEvent);
   return false;
   }
}在线程中的代码:if (!m_com.WaitEventChar())
continue;
                else
                m_com.Read(buf, 1024);
可是现在事件好像不被驱动,我把if (!m_com.WaitEventChar())
continue;去掉就可以收到数据,但是加上就不能收到数据

解决方案 »

  1.   

    不应该啊,是不是没有SetCommMask啊?
    SetCommMask(hCom, EV_RXFLAG);
      

  2.   

    在OPEN的时候已经SetCommMask(hCom, EV_RXFLAG);了
      

  3.   

    SetCommMask(hCom, EV_RXCHAR);才对啊,奇怪了
      

  4.   

    是的,我把程序中的EV_RXFLAG都改成EV_RXCHAR就可以了,谁能告诉我这2个有什么不同
      

  5.   

    EV_RXCHAR是串口收到数据就响应,每个字符到达接收缓冲区的时候,就激发事件。
    EV_RXFLAG不是普通字符的响应,是指SetCommState指定的DCB结构的事件字符所以监测EV_RXCHAR这个事件就可以了
      

  6.   

    是dcb.EvtChar吧,谢谢楼上的解释...