我执行WriteFile写串口的时候失败,GetLastError()返回错误23------数据错误 (循环冗余检查)。 
请问产生的原因是什么?产生这个错误以后我的串口似乎就不能写了,怎么样去掉这个错误?thanks!

解决方案 »

  1.   

    这是我写的串口类中的一部分:
    HANDLE m_hComDev;// 串口设备句柄  
    OVERLAPPED m_osRead,m_osWrite;//头文件中如此定义
    int CRs232::WriteCommBlock(  LPCVOID  lpByte,  UINT  nBytesToWrite)//向串口发送数据
    {  
        int e_NotConnected =0;
    int  e_TransmitError =0;
    int e_TransmitNotFinished =0;
    DWORD   dwBytesWritten,  dwErrorFlags; 
    COMSTAT  ComStat;
         if(  !m_bConnected  )  //  串口没有打开      
          return  e_NotConnected;  
            if(WaitForSingleObject(m_osWrite.hEvent,0)  !=  WAIT_OBJECT_0)      
          return  e_TransmitNotFinished;    
            ResetEvent(m_osWrite.hEvent);  
    if(!WriteFile(m_hComDev,lpByte,nBytesToWrite,&dwBytesWritten,&m_osWrite))
    {
    //  往串口发送数据
    if(  GetLastError()  ==  ERROR_IO_PENDING  )      
    return  0;    //  正在后台发送    
    ClearCommError(  m_hComDev,  &dwErrorFlags,  &ComStat  )  ;  //  出现错误,清除错误标志  
      return    e_TransmitError;    //  发送出错  
    }  
    return  0;  //  WriteFile返回1,发送成功}
    }
      

  2.   

    谢谢楼上,我没有使用overlap读写,不知道这样对不对
    BOOL CSerial::Write(BYTE *pBuf, DWORD dwLen, DWORD *pWritten)
    {
        if(m_hCom == INVALID_HANDLE_VALUE)return FALSE;
        int nRet = WriteFile(m_hCom, (void *)pBuf, dwLen, pWritten, NULL);
        if(nRet != 0)
            return TRUE; Sleep(500);
    int err = GetLastError();    //返回23    return FALSE;
    }
      

  3.   

    这样作个例子吧:
    unsigned short gcWriteCommBlock( HANDLE portID, unsigned char *lpBuf, int *len )
    {

    DWORD tlen; if( portID == INVALID_HANDLE_VALUE )
    return CER_NOOPEN; // 串口未打开 PurgeComm( portID, 
    PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR );    // 清除输入输出缓冲BUF
    if( !WriteFile( portID, lpBuf, *len, &tlen, NULL ) )
    {
    PurgeComm( portID, PURGE_TXABORT | PURGE_TXCLEAR );
    *len = 0;
    return CER_COMMUNICATE; // 通讯错误
    } if( tlen < (DWORD)(*len) )
    {
    PurgeComm( portID, PURGE_TXABORT | PURGE_TXCLEAR );
    *len = tlen;
    return CER_READERTIMEOUT; // Time out
    }

    return 0;
    }
      

  4.   

    我使用while(1)循环不停的WriteFile,没有WaitForSingleObject,是不是不行啊?
      

  5.   

    郁闷,今天执行SetupComm的时候GetLastError()总返回23
      

  6.   

    这里,执行到SetCommState的时候出现错误,help, thanks
    DCB  m_dcb; 
        if (!(bRet = GetCommState(m_hCom, &m_dcb)))     
            return FALSE;    m_dcb.BaudRate          = nBaudRate;
        m_dcb.fBinary           = 1;
        m_dcb.fParity           = 0;
        m_dcb.fOutxCtsFlow      = 0;
        m_dcb.fOutxDsrFlow      = 0;
        m_dcb.fDtrControl       = DTR_CONTROL_ENABLE;
        m_dcb.fDsrSensitivity   = 0;
        m_dcb.fTXContinueOnXoff = 1;
        m_dcb.fOutX             = 0;
        m_dcb.fInX              = 0;
        m_dcb.ErrorChar         = 0;
        m_dcb.fNull             = 0;
        m_dcb.fRtsControl       = RTS_CONTROL_ENABLE;
        m_dcb.fAbortOnError     = 1;
        m_dcb.fDummy2           = 0;
        m_dcb.ByteSize          = nDataSize;
        m_dcb.Parity            = nParity;
        m_dcb.StopBits          = nStopBit;
        
        bRet = SetCommState(m_hCom, &m_dcb);
      

  7.   

    郁闷,现在发现GetCommState后马上SetCommState就会出现错误(不修改m_dcb),不知道为什么了
      

  8.   

    老兄;咱两个是难友阿!
    咱两个的问题是一样的,不过有人建议用setcomtimesout试试,明天我试试看有没有结果。
      

  9.   

    SetCommTimeouts我试过可以,我的问题解决了