实例:
点击一个按钮
现发送4B 41 01 00 0B 得到返回值后,发送 4B 41 02 00 08得到返回值后,发送4B 41 03 00 09;依次发送
4B 41 04 00 0E,4B 41 05 00 0F,4B 41 06 00 0C,4B 41 07 00 0D,4B 41 08 00 02,4B 41 09 00 03,4B 41 0A 00 00
 

解决方案 »

  1.   

    补充:BYTE CR232TESTDlg::Transmitt(int nchar, BYTE *pData)
    {
    BYTE sum=0;
    CByteArray   array;
        array.RemoveAll();                   //清空数组
        array.SetSize(nchar);                //设置数组大小为帧长度
        for(int i=0; i<nchar; i++)
    {     
    //把待发送数据存入数组
            array.SetAt(i,pData[i]);
    sum+=pData[i];
    }
        // 打开串口并发送数据
        if (!m_cComm.GetPortOpen())
               m_cComm.SetPortOpen(TRUE);
        m_cComm.SetOutput(COleVariant(array));
        return sum;
    }void CR232TESTDlg::OnJiaod() 
    {
    // TODO: Add your control notification handler code here
    BYTE Tdata[5]={0x4B,0x41,0x01,0x00,0x0B};
    mode=1;
    SetTimer(0,6000,NULL);
    Transmitt(5,Tdata);
        m_cComm.SetInputLen(1);
    }void CR232TESTDlg::OnJiaod1() 
    {
    // TODO: Add your control notification handler code here
    BYTE Tdata[5]={0x4B,0x41,0x02,0x00,0x08};
    mode=2;
    Transmitt(5,Tdata);
    m_cComm.SetInputLen(1);
    }void CR232TESTDlg::OnJiaod2() 
    {
    // TODO: Add your control notification handler code here
    BYTE Tdata[5]={0x4B,0x41,0x03,0x00,0x09};
    mode=3;
    Transmitt(5,Tdata);
        m_cComm.SetInputLen(1);
    }void CR232TESTDlg::OnJiaod3() 
    {
    // TODO: Add your control notification handler code here
    BYTE Tdata[5]={0x4B,0x41,0x04,0x00,0x0E};
    mode=4;
    Transmitt(5,Tdata);
    m_cComm.SetInputLen(1);
    }void CR232TESTDlg::OnJiaod4() 
    {
    // TODO: Add your control notification handler code here
    BYTE Tdata[5]={0x4B,0x41,0x05,0x00,0x0F};
    mode=5;
    Transmitt(5,Tdata);
        m_cComm.SetInputLen(1);
    }void CR232TESTDlg::OnJiaod5() 
    {
    // TODO: Add your control notification handler code here
    BYTE Tdata[5]={0x4B,0x41,0x06,0x00,0x0C};
    mode=6;
    Transmitt(5,Tdata);
    m_cComm.SetInputLen(1);
    }void CR232TESTDlg::OnJiaod6() 
    {
    // TODO: Add your control notification handler code here
    BYTE Tdata[5]={0x4B,0x41,0x07,0x00,0x0D};
    mode=7;
    Transmitt(6,Tdata);
        m_cComm.SetInputLen(1);
    }void CR232TESTDlg::OnJiaod7() 
    {
    // TODO: Add your control notification handler code here
    BYTE Tdata[5]={0x4B,0x41,0x08,0x00,0x02};
    mode=8;
    Transmitt(6,Tdata);
    m_cComm.SetInputLen(1);
    }void CR232TESTDlg::OnJiaod8() 
    {
    // TODO: Add your control notification handler code here
    BYTE Tdata[5]={0x4B,0x41,0x09,0x00,0x03};
    mode=9;
    Transmitt(7,Tdata);
        m_cComm.SetInputLen(1);
    }void CR232TESTDlg::OnJiaod9() 
    {
    // TODO: Add your control notification handler code here
    BYTE Tdata[5]={0x4B,0x41,0x0A,0x00,0x00};
    mode=10;
    Transmitt(7,Tdata);
    m_cComm.SetInputLen(1);
    }
    void CR232TESTDlg::OnOnCommMscomm() 
    {
    VARIANT     vResponse;
            int         k;
    unsigned char *Recievedata;
    static signed short int buft;
    static signed short int buf;
        if (m_cComm.GetCommEvent()==comEvReceive)
        {    //判断是否comEvReceive事件
             k=m_cComm.GetInBufferCount();
            if (k>0)
             {
                m_cComm.SetInputLen(k);
                //读取接收到的数据
                vResponse=m_cComm.GetInput();
       Recievedata=(unsigned char *) vResponse.parray->pvData;      if(Recievedata[0]==0xB4)
    {
    buft = MAKEWORD(Recievedata[6], Recievedata[7]);
    buf = MAKEWORD(Recievedata[4], Recievedata[5]);
    switch(mode)
    {
    case 0:
    break;
    case 1:
            if (Recievedata[3]==0x04)
               {
          m_ang1.Format("%5.2f  %.2f℃",1505*(float)buf/206264.8,(float)buft/10);//
                 }
            else
               {
                                          m_ang1.Format("%.d号错误", 1); 
                 }
            OnJiaod1();
            break;
    case 2:
    if (Recievedata[3]==0x04)
    {
          m_ang2.Format("%5.2f  %.2f℃",1505*(float)buf/206264.8,(float)buft/10);//

    else
    {
                                          m_ang2.Format("%.d号错误", 2); 
    }
                                    OnJiaod2();
    break;
    case 3:
    if (Recievedata[3]==0x04)
    {
    m_ang3.Format("%5.2f  %.2f℃",1505*(float)buf/206264.8,(float)buft/10);
                                         } 
    else
    {
                                           m_ang3.Format("%.d号错误", 3); 
    }
                                    OnJiaod3();
    break;
    case 4:
    if (Recievedata[3]==0x04)
    {
    m_ang4.Format("%5.2f  %.2f℃",1505*(float)buf/206264.8,(float)buft/10);/

    else
    {
                                             m_ang4.Format("%.d号错误", 4); 
    }
                                    OnJiaod4();
    break;
    case 5:
    if (Recievedata[3]==0x04)
    {
    m_ang5.Format("%5.2f  %.2f℃",1505*(float)buf/206264.8,(float)buft/10);//

    else
    {
                                            m_ang5.Format("%.d号错误", 5); 
    }
                                    OnJiaod5();
    break;
    case 6:
    if (Recievedata[3]==0x04)
    {
    m_ang6.Format("%5.2f  %.2f℃",1505*(float)buf/206264.8,(float)buft/10);//

    else
    {
                                           m_ang6.Format("%.d号错误", 6); 
    }
                                    OnJiaod6();
    break;
    case 7:
    if (Recievedata[3]==0x04)
    {
    m_ang7.Format("%5.2f  %.2f℃",1505*(float)buf/206264.8,(float)buft/10);

    else
    {
                                             m_ang7.Format("%.d号错误", 7); 
    }
                                    OnJiaod7();
    break;
    case 8:
    if (Recievedata[3]==0x04)
    {
    m_ang8.Format("%5.2f  %.2f℃",1505*(float)buf/206264.8,(float)buft/10);// } 
    else
    {
                                             m_ang8.Format("%.d号错误", 8); 
    }
                                    OnJiaod8();
    break;
    case 9:
    if (Recievedata[3]==0x04)
    {
    m_ang9.Format("%5.2f  %.2f℃",1505*(float)buf/206264.8,(float)buft/10);//

    else
    {
                                            m_ang9.Format("%.d号错误", 9); 
    }
    OnJiaod9();
    break;
    case 10:
    if (Recievedata[3]==0x04)
    {
    m_ang10.Format("%5.2f  %.2f℃",1505*(float)buf/206264.8,(float)buft/10);//

    else
    {
                                           m_ang10.Format("%.d号错误", 10); 
    }
                                    break;
    case 18:
    if (Recievedata[3]==0x00)
    {
    MessageBox("联机成功!", MB_OK);

    else
    {
    MessageBox("联机失败!", MB_OK);
    }
    break;
    default:
    break;
    }
    }
     }
        UpdateData(FALSE);
        } 
    // return TRUE ;
    }
      

  2.   

    前段时间做modbus协议的时候,不断点击按钮也收到了很多垃圾数据,之后在OnInitDialog的时候加了sleep(40)之后就没有收到垃圾数据。不知道对你有没有帮助...
      

  3.   

    1.看波特率是否正确
    2.看协议是否正确主从式的试试modbus协议如果错误就重发信息