通过serialport.cpp中
::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff,(LPARAM)port->m_nPortNr);传递消息然后进入LONG CGraphView::OnComm(WPARAM ch,LPARAM port)函数进行数据处理我的接收数据帧是不定长的,同步传输  有同步头+地址+数据信息+校验+同步尾api中能通过comstat.cbInQue获取缓冲区字节个数,而这个我修改serialport类,传递个数老是内存错误,而不传递长度我提取感觉很费事,想不出怎么弄好,我是新手想各位有经验的给点提示或几句代码,谢谢

解决方案 »

  1.   


    cserialport类中(WPARAM ch,LPARAM port):
    ch返回一个多态性指针指向保存串口读取数据 port返回串口号我对返回第二个数据进行改装,内存泄漏,如果不改,那一个字符一个字符取,是不是就慢(这里我估计是我处理函数的问题,是不是还是再调用一个专门处理数据的函数?判断同步头,同步尾,校验等)
      

  2.   

    BOOL  CSerialPort::OpenPort(LPCTSTR Port, int BaudRate, int DataBits, int StopBits, int Parity)
    {
    if(m_hComm==INVALID_HANDLE_VALUE)
    {
    m_hComm=CreateFile( Port, GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING, 0, NULL );
    if(m_hComm==INVALID_HANDLE_VALUE )
    {
    AfxMessageBox(_T("无法打开端口!请检查是否已被占用。"));
    return FALSE;
    } DCB dcb;
    GetCommState(m_hComm,&dcb);
    dcb.BaudRate=BaudRate;
    dcb.ByteSize=DataBits;
    dcb.Parity=Parity;
    dcb.StopBits=StopBits;
    dcb.fParity=FALSE;
    dcb.fBinary=TRUE;
    dcb.fDtrControl=0;
    dcb.fRtsControl=0;
    dcb.fOutX=dcb.fInX=dcb.fTXContinueOnXoff=0; //设置状态参数
    SetCommMask(m_hComm,EV_RXCHAR);
    SetupComm(m_hComm,16384,16384);
    //SetupComm(m_hComm,2048,2048);
    if(!SetCommState(m_hComm,&dcb))
    {
    AfxMessageBox(_T("无法按当前参数配置端口,请检查参数!"));
    PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
    ClosePort();
    return FALSE;
    } //设置超时参数

    COMMTIMEOUTS CommTimeOuts;
    GetCommTimeouts(m_hComm,&CommTimeOuts);
           
    CommTimeOuts.ReadIntervalTimeout=100;
    CommTimeOuts.ReadTotalTimeoutMultiplier=0;
    CommTimeOuts.ReadTotalTimeoutConstant=1000;
    CommTimeOuts.WriteTotalTimeoutMultiplier=0;
    CommTimeOuts.WriteTotalTimeoutConstant=0; if(!SetCommTimeouts(m_hComm,&CommTimeOuts))
    {
    AfxMessageBox(_T("无法设置超时参数!"));
    PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
    ClosePort();
    return FALSE;
    }
    PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
    return TRUE;
    } return FALSE;
    }
    void  CSerialPort::ClosePort(void)
    {
    if(m_hComm != INVALID_HANDLE_VALUE)
    {
    SetCommMask(m_hComm,0);
    PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
    CloseHandle(m_hComm);
    m_hComm=INVALID_HANDLE_VALUE;
    //::AfxMessageBox(L"串口已经关闭");
    }

    }BOOL  CSerialPort::ReadData()
    {
    if(m_hComm==INVALID_HANDLE_VALUE)
    {
    return FALSE;
    } nread = 0 ; 
    ZeroMemory(rbuffer, BUFSIZE);
    BOOL bReadState = (BOOL)ReadFile(this->m_hComm, rbuffer, BUFSIZE, &nread, NULL);
    if(!bReadState)
    {
    //MessageBox(_T("无法从串口读取数据!"));
    return FALSE ; 
    }
    else
    {
    if(nread != 0)
    return TRUE ; 
    }
    return FALSE ; 
    }BOOL  CSerialPort::WriteData(const char *data,int length)
    {
    if(m_hComm==INVALID_HANDLE_VALUE)
    {
    return FALSE;
    } BOOL bWriteState;
    DWORD dwBytesWritten=0;
    bWriteState=(BOOL)WriteFile(m_hComm,data,length*sizeof(char),&dwBytesWritten,NULL);
    return bWriteState; 
    }
    以上是我原来封装使用过的串口类,其中nread就是实际获取到的数据长度啊