本人用VC2005做串口编程,采用的是WIN32 API事件驱动方式,事件线程中WAITCOMMEVENT()函数通过了,却在WAITFORSINGLEOBJECT()函数这里卡住了,我想可能发生了ERRO_IO_PENDING 错误,但是我没有读写数据啊,怎么就发生这种错误了

解决方案 »

  1.   

    程序在WaitCommEvent就以失败,导致waitforsingleobject等不到WAIT_OBJECT_0,用GetLastError()得到IO_ERROR_PENDING
    //处理打开串口事件
    void CDataAcquisitionView::OnOpencom()
    {
    CString strDis;
    hCom = CreateFile(myCom,GENERIC_READ|GENERIC_WRITE,
    0,NULL,OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    NULL);
    if(hCom != INVALID_HANDLE_VALUE)
    {
      SetupComm(hCom,1024,512);                                        //设置串口输入缓冲区及输出缓冲区大小
      DCB myDCB;                                                       //DCB是一种数据结构,串口通信中,使用该数据结构存放通信参数
      GetCommState(hCom,&myDCB);                                       //获取当前串口通信参数的的设置值
      myDCB.BaudRate = comBaudRate;
      myDCB.fBinary  = true;
      myDCB.fParity = comfParity;
      myDCB.ByteSize =8;
      myDCB.Parity = comParity;
      myDCB.StopBits =(BYTE) ONESTOPBIT;
      SetCommState(hCom,&myDCB);                                       //设置串行通信参数
      AfxMessageBox(_T("串口打开成功!"));
      blnOpened = true;
        }
    else
    {
    AfxMessageBox(_T("串口打开失败!当前串口被占用,或其他错误"));
    blnOpened = false;
    }
    hWnd = GetSafeHwnd();                                             //得到当前窗口句柄
    DWORD dwParam;
       if(!SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY))                    //设置允许的事件类型
       {
             AfxMessageBox(_T("建立事件掩码失败!"));
       }
        
    hThreadEvent = CreateThread(NULL,0,
       (LPTHREAD_START_ROUTINE)ThreadProcEvent,
       &dwParam,0,&dwThreadID);
    if(hThreadEvent == INVALID_HANDLE_VALUE)
    {
           AfxMessageBox(_T("事件线程创建失败!"));
    }
        hEventRun =true;
      
    }
    ///////////////////////
    DWORD ThreadProcEvent(LPVOID pParam)
    {
    DWORD dwEvtMask,dwRes;
    Eol.hEvent = CreateEvent(NULL,TRUE,                                           //设置Eol.hEvent成员为无信号状态
    FALSE,NULL);
    while(hEventRun)
    {
    WaitCommEvent(hCom,&dwEvtMask,                                             //监视串口事件
              &Eol);
           
    dwRes = WaitForSingleObject(Eol.hEvent,                                    //等待信号
       1000);
    switch(dwRes)
    {
    case WAIT_OBJECT_0:                                                        //成功得到事件监视结果
    switch(dwEvtMask)
    {
    case EV_RXCHAR:                                                        //接收到数据
    if(!fStopMsg)
    {
    fStopMsg = true;
    ::PostMessage(hWnd,WM_MYMSG,                                    //向主线程发送消息,接收到数据
    0,(LPARAM)EV_RXCHAR);
    }
    break;
    case EV_TXEMPTY:
    AfxMessageBox(_T("send buffer is empty"));
                    break;
    }
    }
    break;
    }
    return true;
    }
      

  2.   

    GetLastError()得到IO_ERROR_PENDING 
    //这个不是表示串口操作没有完成吗?这时串口还在读入数据或者写出数据
      

  3.   

    补充一下,我是采用事件驱动方式监控串口事件的,而且我在事件线程中就没有读写数据,怎么就发生ERROR_IO_PENDING了呢,用串口调试助手是可以和单片机的