在串口接收中,用ClearCommError()函数,得到的comstat的cbInQue总<=8,怎样才能〉8?
就是说我收22个数要分3次才能收完。怎样才能一次收完阿?谢谢!

解决方案 »

  1.   

    用sleep()函数,强制线程休眠,22个数大概有30ms就可以,你还可以通过设COMMTIMEOUTS的各个参数考虑两个字符到达的时间间隔是否到达一定超时时间,不过第一种方法比较简单
      

  2.   

    不是这样,当收〉8个字节时,
    有这种情况:
    EV_RXCHAR事件发生了,我用ClearCommError查询字节数,cbInQue会是0,咋回事?
      

  3.   

    用API就不会有问题了
    用MSCOMM我还没找到办法
    关注
      

  4.   

    不明白,没这个问题的呀SetInBufferSize(1024); //设置输入缓冲区的大小(设置了吗?)
      

  5.   

    EV_RXCHAR事件发生了,我用ClearCommError查询字节数,cbInQue会是0,咋回事?
    缓冲中的数据已空。应该重新用CleareCommError进行测试。
    另外如果是异步读串口,ReadFile可能因另一个IO操作在进行而返回FALSE, 需要用GetOverLappedResult来获得真正读取的字节数。
      

  6.   

    如果cbInQue=0并不能保证没接到字符的话,是不是用GetOverLappedResult就直接判断收到几个字节就好了呢?我没见过这方面的例子耶!能讲详细点吗?多谢!!
      

  7.   

    jobine(愚人渡):
    EV_RXCHAR事件发生了,
    我设了个循环一直读,用ClearCommError查询字节数,cbInQue一直是0
    咋回事阿?
      

  8.   

    LIN1120() :
    GetOverLappedResult应该是readfile以后判断拉
      

  9.   

    给你一段程序看一下
    BOOL CXXComm::ReadComm(DWORD &dwBytesRead)
    {
    BYTE byBuffer[BUFFER_LENGTH];
    DWORD dwError;
    BOOL bRead = TRUE, bRet = FALSE;
    COMSTAT comstat;
    while (m_bCommOpen)
    {
    if (ClearCommError(m_hComm, &dwError, &comstat) && dwError > 0) //if any error
    {
    ::PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_RXABORT);
    break;
    }
    if (0 == comstat.cbInQue)
    {
    break;
    }
    if (bRead)
    {
    if (!ReadFile(m_hComm, byBuffer, BUFFER_LENGTH, &dwBytesRead, &m_ov))
    {
    if (GetLastError() == ERROR_IO_PENDING)
    {
    bRead = FALSE;
    }
    else
    {
    dwBytesRead = 0;
    //error, unhandled
    }
    }
    else
    {
    bRead = TRUE;
    }
    }
    if (!bRead)
    {
    bRead = TRUE;
    if (!GetOverlappedResult(m_hComm, &m_ov, &dwBytesRead, TRUE))
    {
    dwBytesRead = 0;
    //error, unhandled
    }
    }
    if (dwBytesRead > 0)
    {
    bRet = TRUE;
    m_cs.Lock();
    m_InBuffer.AddBuffer(dwBytesRead, byBuffer);
    m_cs.Unlock();
    }
    }//while
    return bRet;
    }
      

  10.   

    jobine(愚人渡):
    if (dwBytesRead > 0)
    {
    bRet = TRUE;
    m_cs.Lock();
    m_InBuffer.AddBuffer(dwBytesRead, byBuffer);
    m_cs.Unlock();
    }
    是什么意思啊?m_InBuffer,byBuffer是怎么定义的阿?谢谢!