做串口通信,开始用到事件处理。
bReadStatus = ReadFile( m_hComDev, buffer, dwBytesRead, &dwBytesRead,                             &m_OverlappedRead );
这是我们读数据时会写的函数,这儿存在一些疑问:m_OverlappedRead是我们创的一个句柄
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );那么在ReadFile未完成时m_OverlappedRead.hEvent是什么状态,完成时又是什么状态?,如果这些状态都是系统自动设定,那么我们为何要设成是手动句柄呢?
我做了一个函数,之前设置了一个事件(在OpenComm()中完成:SetCommMask(m_hComDev,EV_RXCHAR,然后在每次读数据之前用WaitForRead()等待是否有数据发生。
函数如下:
int CReadBinDlg::WaitForRead()
{
    OVERLAPPED os;
    DWORD dwMask=0,dwTrans=0;
    COMSTAT ComStat;
    DWORD dwErrorFlags;
    memset(&os,0,sizeof(OVERLAPPED));
    os.hEvent =CreateEvent(NULL,TRUE,FALSE,NULL);
    if(os.hEvent ==NULL)
    {
        AfxMessageBox("Can't create event object!");
        return (UINT)-1;
    }
    ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);
    if(ComStat.cbInQue)
    {
        CloseHandle(os.hEvent);
        return 0;
    }
    dwMask=0;
    if(!WaitCommEvent(m_hComDev,&dwMask,&os))
    {
        if(GetLastError()==ERROR_IO_PENDING)
            //无限等待重叠操作结果
        {
            GetOverlappedResult(m_hComDev,&os,&dwTrans,TRUE);
        }
        else        {
            CloseHandle(os.hEvent);
            return (UINT)-1;
        }
    }    CloseHandle(os.hEvent );
    return 0;
}
我发现WaitForRead()好像并不与m_OverlappedRead有什么关系,那它又是如何判断GetOverlappedResult(m_hComDev,&os,&dwTrans,TRUE);已完成呢?这里不态理解,因为它们是在同一个线程里的,等待有事件发生,然后就开始读,否则就停在GetOverlappedResult()上。
望高手能解答,不胜感谢

解决方案 »

  1.   

    你应该判断超时退出才对
    BOOL ZComm::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;
       }}
      

  2.   

    谢谢朋友的帮忙,请细看一下题目:
    这是我们读数据时会写的函数,这儿存在一些疑问:m_OverlappedRead是我们创的一个句柄
    m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );那么在ReadFile未完成时m_OverlappedRead.hEvent是什么状态,完成时又是什么状态?,如果这些状态都是系统自动设定,那么我们为何要设成是手动句柄呢?

    我做了一个函数,之前设置了一个事件(在OpenComm()中完成:SetCommMask(m_hComDev,EV_RXCHAR,然后在每次读数据之前用WaitForRead()等待是否有数据发生。
    我发现WaitForRead()好像并不与m_OverlappedRead有什么关系,那它又是如何判断GetOverlappedResult(m_hComDev,&os,&dwTrans,TRUE);已完成呢?这里不态理解,因为它们是在同一个线程里的,等待有事件发生,然后就开始读,否则就停在GetOverlappedResult()上。