使用API串口直接编程,由串口调试助手发送数据,我的程序里有一个线程里反复循环读取串口数据,发现接受到的数据少了,不知道为什么啊?
串口使用的是同步方式,( 这样也能做到没有数据到达时线程堵塞)。
奇怪的是,如果我用两个串口调试助手相互通讯,发现发送的数据一个也不会少!这就排除了是线路的原因了。但是这是为什么呢?

解决方案 »

  1.   

    你把代码发给我,我帮你看看...
    [email protected]
      

  2.   

    以下四大开串口
    BOOL CEasyCom::OpenPort()
    {
    CString strPort;
    strPort.Format("COM%d",nComPort);
    hCom=CreateFile(strPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,NULL);
    if(hCom==INVALID_HANDLE_VALUE)
    {
    CloseHandle(hCom);
    return FALSE;   //打开串口失败
    }
    memset(&READ_OS,0,sizeof(OVERLAPPED));
    memset(&WAIT_OS,0,sizeof(OVERLAPPED));
    DCB dcb1;
    if(!GetCommState(hCom,&dcb1)) 
    {
    CloseHandle(hCom);
    return FALSE;;//读取当前com口状态
    }
        dcb1.BaudRate=this->dwBaudRate;
    dcb1.StopBits=this->byteStopBits;//一停止位
    dcb1.ByteSize=this->byteByteSize;//数据位数
    dcb1.fParity=this->dwfParity;//是否允许奇偶校验
    dcb1.Parity=this->byteParity;//校验
    dcb1.fBinary=this->dwfBinary;//允许二进制的模式

    if(!SetCommState(hCom,&dcb1)) 
    {
    CloseHandle(hCom);
    return FALSE;//设置com口状态
    }
    if(!SetCommMask(hCom,dwComMask)) 
    {
    CloseHandle(hCom);
    return FALSE;//设置响应的事件
    }
    if(!SetupComm(hCom,dwInQueue,dwOutQueue)) 
    {
    CloseHandle(hCom);
    return FALSE;
    }
        // COMMTIMEOUTS对象
        COMMTIMEOUTS comTimeOut;
    // 接收时,两字符间最大的时延
        comTimeOut.ReadIntervalTimeout = 0;
        // 读取每字节的超时
    comTimeOut.ReadTotalTimeoutMultiplier = 0;
    // 读串口数据的固定超时
    comTimeOut.ReadTotalTimeoutConstant = 0;
        // 写每字节的超时
    comTimeOut.WriteTotalTimeoutMultiplier = 0;
        // 写串口数据的固定超时
    comTimeOut.WriteTotalTimeoutConstant = 0;
    // 将超时参数写入设备控制
    if(!SetCommTimeouts(hCom,&comTimeOut)) 
    {
    CloseHandle(hCom);
    return FALSE;
    }

    if(!PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR)) 
    {
    CloseHandle(hCom);
    return FALSE;
    }
    WAIT_OS.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
        READ_OS.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
    return TRUE;   //打开串口
    }
      

  3.   

    我刚才把串口改成OVERLAPPED的,也是一样的结果,接受部分如下
    CEasyCom *pEasyCom=reinterpret_cast<CEasyCom *>(lpParam);
    DWORD dwEvtMask=0;
    DWORD dwErrorFlags;
    DWORD dwLength;
    DWORD dwcase;
    COMSTAT ComStat;
    while(TRUE)
    {
    dwEvtMask=0;
    WaitCommEvent(pEasyCom->hCom,&dwEvtMask,&pEasyCom->WAIT_OS);//等待事件的发生
    WaitForSingleObject(pEasyCom->WAIT_OS.hEvent,INFINITE);
    if((dwEvtMask&EV_RXCHAR)==EV_RXCHAR)
    {
    ClearCommError(pEasyCom->hCom,&dwErrorFlags,&ComStat);//得到设备当前状态!
    dwLength = ComStat.cbInQue;/*得到当前收到的数据数*/
    if(dwLength>0)
    {
    DWORD dwByteRead=0;
    BOOL fRead=ReadFile(pEasyCom->hCom,pEasyCom->DataInBuff,dwLength,&dwByteRead,&pEasyCom->READ_OS);
    if(!fRead)
    {
    dwcase=WaitForSingleObject(pEasyCom->READ_OS.hEvent,INFINITE);
    }
    // PurgeComm(pEasyCom->hCom,PURGE_RXCLEAR);
    ResetEvent(pEasyCom->READ_OS.hEvent);
    ResetEvent(pEasyCom->WAIT_OS.hEvent);
    pEasyCom->pOnEasyCom(dwByteRead,pEasyCom->DataInBuff);
    }
    }
    }