有没有办法用waitsingalobject来等待串口上的N字节的buffer?我只要一调用ReadFile,如果串口上没有数据的话,就返回了,似乎WaitSingalObject用不上,
我想要等待串口上已经有了指定的N长度的buffer之后再ReadFile。请教有没有什么办法?

解决方案 »

  1.   

    我自己已经用了重叠方式打开的
    char lpInBuffer[1024];
    DWORD dwBytesRead=1024;
    COMSTAT ComStat;
    DWORD dwErrorFlags;
    OVERLAPPED m_osRead;
    memset(&m_osRead,0,sizeof(OVERLAPPED));
    m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);ClearCommError(hCom,&dwErrorFlags,&ComStat);
    dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);
    if(!dwBytesRead)
    return FALSE;
    BOOL bReadStatus;
    bReadStatus=ReadFile(hCom,lpInBuffer,
    dwBytesRead,&dwBytesRead,&m_osRead);if(!bReadStatus) //如果ReadFile函数返回FALSE
    {
    if(GetLastError()==ERROR_IO_PENDING)
    //GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
    {
    WaitForSingleObject(m_osRead.hEvent,2000);
    //使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
    //当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
    PurgeComm(hCom, PURGE_TXABORT|
    PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
    return dwBytesRead;
    }
    return 0;
    }
    PurgeComm(hCom, PURGE_TXABORT|
      PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
    return dwBytesRead;
      

  2.   

    现在的问题是,一调用ReadFile返回永远是true(这时候的数据还没有到串口),没有等待了,这样的话,我就没有等到串口上有数据的时候再去读了。
    怎么解决这个问题呢?
      

  3.   

    dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);
    它的值可能是dwBytesRead=0
    你读0个字节,当然ReadFile返回true