问题如题,那位兄弟遇到过上面的问题啊?我用超级终端在服务器端将该串口打开一下,发现服务器端接受数据又恢复正常了。很急,哪位同僚知道原因啊

解决方案 »

  1.   

    源码如下:
    CString strPortName;
    strPortName.Format("\\\\.\\COM%d",pComPortPara->Port);
    //打开串口
    HANDLE hComPort = CreateFile(strPortName,
     GENERIC_READ | GENERIC_WRITE,
                     0,                    // exclusive access
                     NULL,                 // no security attrs
                     OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED , // overlapped I/O
                     NULL ); 
    //打开失败
    if (hComPort == INVALID_HANDLE_VALUE)
    {
    sprintf(logText,"创建串口出错,出错原因:%s",ErrorCode2Text(GetLastError()));
    pLogClass->Write(logText,LOG_LEVEL_HIGH);
    return NULL;
    }
    int g = GetLastError(); //通讯缓冲区大小设置???
    SetupComm(hComPort, 1024,1024); ////读取操作超时设置
    //COMMTIMEOUTS CommTimeOuts;
    //CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
    //CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
    //CommTimeOuts.ReadTotalTimeoutConstant = 0 ;
    //CommTimeOuts.WriteTotalTimeoutMultiplier = 16 ;
    //CommTimeOuts.WriteTotalTimeoutConstant = 3000 ;
    //SetCommTimeouts(hComPort, &CommTimeOuts) ; //串口参数设置
    DCB dcb ;
    dcb.DCBlength = sizeof( DCB ) ;
        GetCommState(hComPort,&dcb ) ;
       
    dcb.BaudRate = pComPortPara->BaudRate;
    dcb.ByteSize = pComPortPara->ByteSize;
    dcb.Parity   = pComPortPara->Parity;
    dcb.StopBits = pComPortPara->StopBits;
    //
    //dcb.fBinary=TRUE;
    //dcb.fDsrSensitivity=false;
    //dcb.fParity=dcb.Parity;
    //dcb.fOutX=false;
    //dcb.fInX=false;
    //dcb.fNull=false;
    //dcb.fAbortOnError=TRUE;
    //dcb.fOutxCtsFlow=FALSE;
    //dcb.fOutxDsrFlow=false;
    //dcb.fDtrControl=DTR_CONTROL_DISABLE;
    //dcb.fDsrSensitivity=false;
    //dcb.fRtsControl=RTS_CONTROL_DISABLE;
    //dcb.fOutxCtsFlow=false;
    //dcb.fOutxCtsFlow=false;

    if (!SetCommState(hComPort,&dcb)) 
    {
    sprintf(logText,"创建串口出错,%s.",ErrorCode2Text(GetLastError()));
    pLogClass->Write(logText,LOG_LEVEL_HIGH);
    //设置错误,退出
    CloseHandle(hComPort) ;
    return NULL;
    }
    //创建一个IOLink对象
    PIOLink pLink = new IOLink;
    pLink->hLink = hComPort;
    pLink->pParameter = NULL;
    pLink->pObject = pComPortPara->pObject;
    //将连接加入链表
    AddLink2List(pLink);
    //关联到完成端口
    if(CreateIoCompletionPort(hComPort,
                    CompletionPortHandle,
    (DWORD)pLink,
    0) == NULL)
    {
    sprintf(logText,"关联到完成端口失败,错误代码:%s",ErrorCode2Text(GetLastError()));
    pLogClass->Write(logText,LOG_LEVEL_HIGH);
    DeleteLink(pLink);
    //shutdown(hSocket,SD_BOTH);
    //closesocket(hSocket);
    //ReleaseLink(pLink);
    //delete pLink;
    //pLink = NULL;
    return NULL;
    }
    //写入日志
    sprintf(logText,"串口%d被打开,句柄:%d",pComPortPara->Port,hComPort);
    pLogClass->Write(logText); //准备接收数据
    RecvMsg(pLink);
      

  2.   

    操作前先调用那个ClearComError,清除串口错误状态,应该是这个函数。
      

  3.   

    还有调用PurgeComm(m_hComm, dwFlags)
        PURGE_TXABORT      Terminates all outstanding overlapped write operations and
                       returns immediately, even if the write operations have not
       been completed. 
        PURGE_RXABORT      Terminates all outstanding overlapped read operations and
                       returns immediately, even if the read operations have not
       been completed. 
        PURGE_TXCLEAR      Clears the output buffer (if the device driver has one). 
        PURGE_RXCLEAR      Clears the input buffer (if the device driver has one). 
      

  4.   

    CreateFile中 
    DWORD dwCreationDisposition,                // how to create
    OPEN_EXISTING,改成CREATE_NEW,试试