Qt:报文接收不完成,产生分帧的处理方法

        最近在设备的测试工装时,通过串口,向设备发送自定义规约,其报文的枕结构已经编写,使用串口助手调试,设备可正常回复,但是通过工装,接收报文会不完整,导致解析失败。使用qDebug打印出来却发现数据被分成了两部分甚至更多部分依次打印,之后通过验证确定了问题出在readyRead的信号与槽这一部分,当回复报文字节较多,报文会进行分帧。

        其实可以搜到,解决方法有很多种,比如:通过数据的帧头帧尾,以及某个字节的特殊判断,进行判断是否为完整数据帧、通过帧头和数据帧长来判断完整帧,然后使用定时器增加重发机制,或者使用定时器将延时读取的数据存入缓冲区,定时时间到后,再一次性读取数据。

       下面介绍其中一方法,其实类似,并没有多大区别:

 

在对应类的头文件中:

private:

         QTimer *waitTime;

再进行具体编写

        waitTime = new QTimer;

       connect(pserialport,&QSerialPort::readyRead,this,[=]()

      {

              waitTime->start(200);

              pbuf.append(pserialport->readAll());

       });

       connect(waitTime,&QTimer::timeout,this,&MainWindow::showRecvData);

 

这是接收的报文会自动存入缓冲区保存,最后组成完整的一条报文进行解析或者按照你所写的处理。

 

 




            connect(waitTime,&QTimer::timeout,this,&MainWindow::showRecvData);

 

Qt:报文接收不完成,产生分帧的处理方法

上一篇:AndroidManifest 中android:exported


下一篇:抽象类-接口