查看完整版本: [-- QserialPort接收的问题 --]

QTCN开发网 -> Qt嵌入式开发 -> QserialPort接收的问题 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

harold00124 2016-12-01 09:53

QserialPort接收的问题

小弟现在用RS232与硬体沟通
硬体会发送一笔5Byte长度的资料
目前因为硬体部份工程师还没做完没办法实测
所以我现在也还不知道硬体发送的状况是如何

而且依照小弟之前练习的经验 有时后插座插拔时模拟器的程式有时会接到一些脉冲乱码

问题1:小弟要如何确保5个Byte接收完毕才让程式执行编译
问题2:接收到的资料要如何分割成1个byte分别放入阵列内?
问题3:要如何确保脉冲乱码不会导致我接收资料的长度出现错误
比方说程式接收到
1byte脉冲乱码 5byte资料(1) 5byte资料(2) 5byte资料(3) 5byte资料(4)

程式编译到 脉冲乱码+4Bbyte资料(1)  1byte资料(1)+4byte资料(2)............




导致整个程式由前到后读取的资料都变的不正确



uidab 2016-12-01 11:04
修改协议,增加起始和结束字节判断。
比如约定AAAAAA,三个字节起始。ZZZZZZ三个字节结束。

harold00124 2016-12-01 11:29
谢谢版大的回应 请教一下有没有相关的范例能够查找呢? 因为小弟刚学 脑袋中会用的代码还不多

uidab 2016-12-01 12:44
harold00124:谢谢版大的回应 请教一下有没有相关的范例能够查找呢? 因为小弟刚学 脑袋中会用的代码还不多 (2016-12-01 11:29) 

以前写的都是MFC的,估计找起来也不容易了。你可以搜一下,网上这方面还是挺多的。

harold00124 2016-12-02 18:09
小弟现在是以传输的资料作XOR当做除错 因为本身传输就有添加检查码在内
但是目前碰的状况是有时后传输的资料速度可能不完整 比方说可能一次5byte 7byte 3byte 或者多到破百byte
现在搞不懂该从何下手
自己手写了几个条件但是就是不知道该如何着手 小弟QT跟C++是同时间入门的 目前刚学1个月还非常的渣

1:如果緩存數大於5 暫停發送請求
2:如果緩存數並非5的基數 等待傳送直到長度正確才做下個動作

因为老板要求检查要频繁 所以我的发送请求用Timer设定为1ms
  1. runTime->start(1);//定時器時脈 ms
        //定時器連結槽
        connect(runTime,SIGNAL(timeout()),this,SLOT(TimeDeary()));
  1. void MainWindow::TimeDeary()//定時器
    {
           WidthRead(Dsp[DspPoint]);
           DspPoint+=1;
           if(DspPoint>23)
           {
               DspPoint=0;
           }
    }
    传送要求後硬体会返回相对应的资料

  1. void MainWindow::Rxreaddate()//解码將值編號取出並呼叫副程式
    {

        bool ok;
        int Read_Data[4];
        QString Strcode[256];
        Rx=Rxserialport->readAll();
        int Rxlength=Rx.length();

        for(int i=0;i<Rxlength;i++)
        {
            Strcode[i]=Rx.mid(0+i,1).toHex();
            qDebug()<<"Strcode"<<i<<":"<<Strcode[i];
        }
        
        


        int Read_CRC=Strcode[4].toInt(&ok,16);
        qDebug()<<"Read_CRC"<<Read_CRC;
        Read_Data[0]=Strcode[1].toInt(&ok,16)>>4;

        Read_Data[1]=(Strcode[1].toInt(&ok,16)&0xF)|(Strcode[2].toInt(&ok,16)>>7);

        Read_Data[2]=(Strcode[2].toInt(&ok,16)&0x7F)>>3;

        Read_Data[3]=((Strcode[2].toInt(&ok,16)&0x6)<<1)|(Strcode[3].toInt(&ok,16)>>6);
        int tex_CRC=(Strcode[0].toInt(&ok,16)^Strcode[1].toInt(&ok,16)^Strcode[2].toInt(&ok,16)^Strcode[3].toInt(&ok,16))|0x01;
        qDebug()<<"Tex_CRC"<<tex_CRC;

        if(Read_CRC==tex_CRC)//比對CRC 正確才將值解碼
        {
        int Value=(Read_Data[0]<<12)|
                  (Read_Data[1]<<8)|
                  (Read_Data[2]<<4)|
                  (Read_Data[3]);
        qDebug()<<"RX"<<Rx;
        qDebug()<<Value;

        RxDatatoWiget(Value);
        }
    }





查看完整版本: [-- QserialPort接收的问题 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled