Qt5下串口对高频率自发性数据的接收及处理方法

2023-10-31

       在项目中需要用Qt5.9采集仪表中的数据,仪表是以200Hz的频率主动向外连续发送数据,发送频率很高,而且主动发送,不需要软件发送一次,再读取一次,而是软件直接读取。这种直接连续读取,有两个关键点:1)如何从接收buffer里面查找出所需的数据帧;2)每次接收的数据buffer里面会有很多帧,如何存起来,每一帧的去解析,处理。

       整个程序分为:1)主程序下串口接收信号与串口接收函数connect部分;2)串口定时器启动函数serial_timerstart();3)串口读取函数部分;

一、主程序下串口接收信号与串口接收函数connect部分

 timer = new QTimer();
 QObject::connect(&serial,&QSerialPort::readyRead,this,&Trajectory::serial_timerstart);
 QObject::connect(timer,&QTimer::timeout,this,&Trajectory::serial_readyRead);
采用定时器,周期性读取串口数据。

二、串口定时器启动函数serial_timerstart();

void Trajectory::serial_timerstart()
{
   timer->start(3);//启动定时器,接收3毫秒数据(根据情况设定)
   buffer.append(serial.readAll());
  
}

三、串口读取函数部分;

void Trajectory::serial_readyRead()
{

    unsigned  char recvdata[255];
    int recvnum=0;

    timer->stop();//停止定时器,

   qDebug() << "receive(buffer.toHex()):= " <<buffer.toHex();
   qDebug() << "receive(buffer.toHex().size()):= " <<buffer.toHex().size();

    att_mg200[0]=0;
    att_mg200[1]=0;
    att_mg200[2]=0;
    att=att_mg200;
    QByteArray buffer0 = "55aa";
    QByteArray buffer1;
    int index=0;
    int recvframenum=0;
     QVector<QByteArray>vect1;
      //从开头搜索"55aa"
       while((index = buffer.toHex().indexOf(buffer0,index))<buffer.toHex().size())
     {
          buffer1 = buffer.toHex().mid(index,80);  //获取55aa***
         if(buffer1.size()==80)
         {
           vect1.push_back(buffer1);
           index=index+80;
           recvframenum++;
          qDebug() << "receive(buffer1):= " <<buffer1;
         }
         else
         {
           break;
         }

      }



    for(int t=0;t<255;t++)
     {
        recvdata[t]=0;
     }


  for(int j=0;j<recvframenum;j++)
    {
      recvnum=0;
      qDebug() << "recvframenum:= " <<recvframenum;
      for(int i=0;i<vect1[j].size();i++) //ASCII码字符转为16进制
          {

              if(vect1[j][i]>='0'&&vect1[j][i]<='9')
                  recvdata[i]=vect1[j][i]-48;
              else if(vect1[j][i]>='A'&&vect1[j][i]<='F')
                  recvdata[i]=vect1[j][i]-65+10;
              else if(vect1[j][i]>='a'&&vect1[j][i]<='f')
                  recvdata[i]=vect1[j][i]-97+10;
              else  QMessageBox::warning(NULL, QString::fromLocal8Bit("警告"), 
                    QString::fromLocal8Bit("接收数据错误"));
           }
          for(int i=0;i<vect1[j].size();i+=2)
          {
              recvdata[recvnum]=recvdata[i]*16+recvdata[i+1];
              qDebug() << "recvdata:= " <<recvdata[recvnum]<<" "<<recvnum<<" "<<i;
              recvnum++;
           }
  else if((recvnum==40)&&(recvdata[0]==85)&&(recvdata[1]==170))
    {
     //接收数据处理
        Gx=((((qint32)recvdata[10])<<24)+(((qint32)recvdata[9])<<16)+
             (((qint32)recvdata[8])<<8)+recvdata[7])*0.000001f;
        Gy=((((qint32)recvdata[14])<<24)+(((qint32)recvdata[13])<<16)+
             (((qint32)recvdata[12])<<8)+recvdata[11])*0.000001f;
        Gz=((((qint32)recvdata[18])<<24)+(((qint32)recvdata[17])<<16)+
             (((qint32)recvdata[16])<<8)+recvdata[15])*0.000001f;
        Gxh=Gxh+Gx;
        Gyh=Gyh+Gy;
        Gzh=Gzh+Gz;

        Ax=((((qint32)recvdata[22])<<24)+(((qint32)recvdata[21])<<16)+
              (((qint32)recvdata[20])<<8)+recvdata[19])*0.000001f;
        Ay=((((qint32)recvdata[26])<<24)+(((qint32)recvdata[25])<<16)+
              (((qint32)recvdata[24])<<8)+recvdata[23])*0.000001f;
        Az=((((qint32)recvdata[30])<<24)+(((qint32)recvdata[29])<<16)+
              (((qint32)recvdata[28])<<8)+recvdata[27])*0.000001f;
        Axh=Axh+Ax;
        Ayh=Ayh+Ay;
        Azh=Azh+Az;

       recvdataNum++;

       qDebug() << "recvdataNum= " <<recvdataNum;


      if(recvdataNum==6000)
      {
       imudata[0]=Gxh/6000;
       imudata[1]=Gyh/6000;
       imudata[2]=Gzh/6000;
       imudata[3]=Axh/6000;
       imudata[4]=Ayh/6000;
       imudata[5]=Azh/6000;

       qDebug() << "imudata[0]= " <<imudata[0];
       qDebug() << "imudata[1]= " <<imudata[1];
       qDebug() << "imudata[2]= " <<imudata[2];
       qDebug() << "imudata[3]= " <<imudata[3];
       qDebug() << "imudata[4]= " <<imudata[4];
       qDebug() << "imudata[5]= " <<imudata[5];


       recvdataNum=0;
       Gxh=0;
       Gyh=0;
       Gzh=0;
       Axh=0;
       Ayh=0;
       Azh=0;
    }

   }
  else
    {
     QMessageBox::warning(NULL, QString::fromLocal8Bit("警告"),QString::fromLocal8Bit("接收到无效数据"));

    }
  }
  buffer.clear();


}

四、调试记录如下:

receive(buffer.toHex()):="036fffff7d210000a97afd55aa2413740f00d9060000d00f00001cfcffffbc9afdffc748010043a795009a12b01100000000dc55aa2418740f009cf0ffffdcd1ffff39c1ffff2a7cfdff7e400100ea7d95009a12b01100000000b655aa241d740f00c91100004fecffff1ef5fffffb77fdff6d4d0100766595009a12b01100000000ee55aa2422740f0004a2ffff036fffff7d210000a97afdff2e4301006e7795009a12b01100000000f355aa2427740f00f310000063f5ffffd8dbffffeba4fdff15400100c03395009a12b01100000000ae55aa242c740f00649dffff35b6ffff6fe5ffff249afdff06500100ad2895009a12b01100000000f555aa2431740f006968000051060000bb020000879efdff3e5901007d3f95009a12b011000000003455aa2436740f00840b0000fcf0ffffcc8c00008081fdffbc2b0100626795009a12b011000000005e55aa243b740f0090ecffffd9ddffffc90a00004890fdff97440100fb5e95009a12b01100000000ee55aa2440740f00a4ddffff6afcffffa2e6ffff3f99fdffe52e0100316395009a12b01100000000ce55aa2445740f00ce8bffff7cbcffff9bd3ffff267dfdff38480100215c95009a12b011000000008455aa244a740f0033d9ffff4fe8ffff0e530000c48dfdff70460100f95095009a12b01100000000e055aa244f740f0086f1ffff935d0000a50e00002573fdffae470100af3995009a12b011000000008255aa2454740f00e76900009e8affff2ff1ffffe286fdff7b4201004a4195009a12b011000000003e55aa2459740f0030d5ffff7d4100006c080000b69dfdfff34601004f3e95009a12b011000000004d55aa245e740f002fd1ffffc43e000048170000bd93fdffd14d0100a43c95009a12b01100000000b155aa2463740f0033390000db2000008f0e0000bf79fdff34610100b45d95009a12b01100000000eb55aa2468740f0073cfffff2a6d0000be3d0000e0a5fdff4a3801006b7b95009a12b01100000000cd55aa246d740f00b82600007f28000036e9ffff69a8fdff3c3901006d7595009a12b011000000001d55aa2431740f006968"

receive(buffer.toHex().size()):= 25102
receive(buffer1):= "55aa2413740f00d9060000d00f00001cfcffffbc9afdffc748010043a795009a12b01100000000dc"
receive(buffer1):= "55aa2418740f009cf0ffffdcd1ffff39c1ffff2a7cfdff7e400100ea7d95009a12b01100000000b6"
receive(buffer1):= "55aa241d740f00c91100004fecffff1ef5fffffb77fdff6d4d0100766595009a12b01100000000ee"
receive(buffer1):= "55aa2422740f0004a2ffff036fffff7d210000a97afdff2e4301006e7795009a12b01100000000f3"
receive(buffer1):= "55aa2427740f00f310000063f5ffffd8dbffffeba4fdff15400100c03395009a12b01100000000ae"
receive(buffer1):= "55aa242c740f00649dffff35b6ffff6fe5ffff249afdff06500100ad2895009a12b01100000000f5"
receive(buffer1):= "55aa2431740f006968000051060000bb020000879efdff3e5901007d3f95009a12b0110000000034"
receive(buffer1):= "55aa2436740f00840b0000fcf0ffffcc8c00008081fdffbc2b0100626795009a12b011000000005e"
receive(buffer1):= "55aa243b740f0090ecffffd9ddffffc90a00004890fdff97440100fb5e95009a12b01100000000ee"
receive(buffer1):= "55aa2440740f00a4ddffff6afcffffa2e6ffff3f99fdffe52e0100316395009a12b01100000000ce"
receive(buffer1):= "55aa2445740f00ce8bffff7cbcffff9bd3ffff267dfdff38480100215c95009a12b0110000000084"
receive(buffer1):= "55aa244a740f0033d9ffff4fe8ffff0e530000c48dfdff70460100f95095009a12b01100000000e0"
receive(buffer1):= "55aa244f740f0086f1ffff935d0000a50e00002573fdffae470100af3995009a12b0110000000082"
receive(buffer1):= "55aa2454740f00e76900009e8affff2ff1ffffe286fdff7b4201004a4195009a12b011000000003e"
receive(buffer1):= "55aa2459740f0030d5ffff7d4100006c080000b69dfdfff34601004f3e95009a12b011000000004d"
receive(buffer1):= "55aa245e740f002fd1ffffc43e000048170000bd93fdffd14d0100a43c95009a12b01100000000b1"
receive(buffer1):= "55aa2463740f0033390000db2000008f0e0000bf79fdff34610100b45d95009a12b01100000000eb"
receive(buffer1):= "55aa2468740f0073cfffff2a6d0000be3d0000e0a5fdff4a3801006b7b95009a12b01100000000cd"
receive(buffer1):= "55aa246d740f00b82600007f28000036e9ffff69a8fdff3c3901006d7595009a12b011000000001d"
receive(buffer1):= "55aa2472740f006eebffff2bedffff74260000287cfdffe04d03901006d765009a11b014000000004d"

五、程序分析:

1)第一步,将接收的buffer转成hex,buffer.toHex(),见上面调试记录的第一组数据

2)通过while循环从接受的缓冲区中搜索所有的以”55aa“开始的数据帧,搜索到之后,将索引号开始的数据帧,后面的80个字符存入buffer1,并且判断buffer1的大小是否为80,用来排除接收的buffer.toHex()中最后搜索到不足一帧的数据(调试记录中"55aa2431740f006968")。

3)将满足80个字符位的数据buffer1存入容器vect1,其中vect1定义:QVector<QByteArray>vect1,连续将所有搜索到的每一帧数据存入容器vect1,并且搜索索引号变更(自加80),从下一帧开始搜索。

  while((index = buffer.toHex().indexOf(buffer0,index))<buffer.toHex().size())   
{          
     buffer1 = buffer.toHex().mid(index,80);  //获取55aa***        
     if(buffer1.size()==80)
    {    
    vect1.push_back(buffer1);           
     index=index+80;        
     recvframenum++;     
    qDebug() << "receive(buffer1):= " <<buffer1;
      }        
 else                
      break;    
  }        

4)利用两个for循环将vect1的每一帧数据分别处理成16进制字节数据。例如:字符'5'的ASCII码值为53,53-48=5,字符'a'的ASCII码值为97,97-97+10=0x0a

for(int j=0;j<recvframenum;j++)
    {
      recvnum=0;
      qDebug() << "recvframenum:= " <<recvframenum;
      for(int i=0;i<vect1[j].size();i++) //ASCII码字符转为16进制
          {

              if(vect1[j][i]>='0'&&vect1[j][i]<='9')
                  recvdata[i]=vect1[j][i]-48;
              else if(vect1[j][i]>='A'&&vect1[j][i]<='F')
                  recvdata[i]=vect1[j][i]-65+10;
              else if(vect1[j][i]>='a'&&vect1[j][i]<='f')
                  recvdata[i]=vect1[j][i]-97+10;
              else  QMessageBox::warning(NULL, QString::fromLocal8Bit("警告"), QString::fromLocal8Bit("接收数据错误"));
           }
          for(int i=0;i<vect1[j].size();i+=2)
          {
              recvdata[recvnum]=recvdata[i]*16+recvdata[i+1];
             qDebug() << "recvdata:= " <<recvdata[recvnum]<<" "<<recvnum<<" "<<i;
              recvnum++;
           }

....

}

六、小结

1)利用indexOf()从字符串的开始搜索特定的字符串,并通过索引号搜索到完整的数据帧

2)利用容器vect,存放搜索的数据帧

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt5下串口对高频率自发性数据的接收及处理方法 的相关文章

  • 从 listWidget 中删除选定的项目

    如何从列表中删除选定的项目QListWidget 我尝试编写以下代码 但它不起作用 QList
  • QML:原始模型中的动态视图重新排序

    使用此 Qt 教程通过拖动视图项来实现 QML 动态视图排序 QML 动态视图排序教程 https doc qt io qt 5 qml dynamicview tutorial html 原始底层模型是QAbstractListModel
  • 设置16位灰度QImage的像素值

    我有一个宽度 imagewidth 和高度 imageheight 的 16 位图像 数据当前存储在长度为 imagewidth imageheight 的无符号短整型数组中 我想从我的数据集 称为 数据 创建一个 16 位灰度 QImag
  • 如何正确配置QDockWidget使其显示/隐藏?

    我是 Qt GUI 的新手 最初想配置一个 Qt Dock 小部件 该小部件在按下某个键 假设为 A 时显示 并在按下另一个键 假设为 B 时隐藏 但经过一番研究 我没有找到任何相关的解决方案 我尝试创建一个切换按钮 第一次按下时将显示停靠
  • 无法在 Qt5 应用程序中加载 qca-ossl

    我决定将我的应用程序从 Qt4 迁移到 Qt5 在 Qt4 中 我将 QCA 与 QCA OSSL 一起使用 没有任何问题 但现在 OSSL 插件不想加载 我已经在 Qt5 下从 git anongit kde org qca git 编译
  • 悬停时突出显示自定义 QWidgetAction

    我的应用程序有一个QMenuBar与一些QMenus 其中每个都有多个QActions 和子QMenus 大部分的QAction 项目是衍生品QWidgetAction并重新实施QWidgetAction createWidget方法 通常
  • 按索引列出的 QML 模型数据

    我有基于 QAbstractListModel 的模型 class RecordModel public QAbstractListModel QQmlContext ctxt engine rootContext ctxt gt setC
  • 我的 Qt5 可执行文件无法在 Visual Studio 2010 之外运行

    我用 Qt5 和 Visual Studio 2010 完成了一个大项目 使用运行按钮 一切都在 Visual Studio 内部 但我的目标当然是在没有视觉工作室的情况下将其发布给其他人 我的问题是 我无法在 Visual Studio
  • Qt5 链接器错误:找不到版本“Qt_5”

    1 问题 我正在尝试构建开源motorcar https github com evil0sheep motorcar在 Arch Linux 机器上从头开始项目 Motorcar 是一款 Linux VR 窗口管理器 可与 Oculus
  • 为什么我的 QGestureRecognizer 收不到触摸事件?

    上下文 我正在尝试创建一个类似推子的小部件 它可以在同一视图中具有多个实例 每个实例都可以由不同的手指同时控制 我想用Qt的手势识别系统 http qt project org doc qt 4 8 gestures overview ht
  • Qt 5.4/Qml:防止绑定循环

    我有一个全局单例 设置 它保存应用程序设置 当我尝试运行以下代码时 我得到一个QML CheckBox Binding loop detected for property checked CheckBox checked Settings
  • Qt 的最佳实践包括和预编译头文件?

    当使用现代和最新的 C 编译器 例如 MSVC2015 并激活预编译头时 当前关于包含 Qt 头文件的 最佳实践 是什么 Example include
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • QML 连接:不推荐使用连接中隐式定义的 onFoo 属性

    升级到 Qt 5 15 时收到以下错误消息 QML Connections Implicitly defined onFoo properties in Connections are deprecated Use this syntax
  • Qt 5.3 无法使 QCompass (QSensor) 在 Windows 8.1 上工作

    我无法让传感器在我的 Asus Transformer T100 上工作 磁力计和指南针无法启动 并且我从加速度计获得假值 始终 x 0 y 9 8 z 0 即使使用我的笔记本电脑 我总是得到相同的结果 第一段文字编辑 Initialisa
  • Qt:删除富文本

    对于明文有QFontMetrics elideText https doc qt io qt 5 qfontmetrics html elidedText https doc qt io qt 5 qfontmetrics html eli
  • 使用 QPrinter 打印第 x 页(共 y 页)

    我使用 qt 从 html 代码生成 pdf 文件 QTextDocument document new QTextDocument document gt setHtml htmlContent QPrinter printer QPri
  • Qt 5.0中添加QFtp

    我需要在我的项目中使用 QFtp 类 当我使用 Qt 5 0 进行开发时 我需要从 gitorious 存储库下载该类 https qt gitorious org qt qtftp https qt gitorious org qt qt
  • 如何将自定义 Qt 类型与 QML 信号一起使用?

    我在 Qt 5 2 qml 应用程序中创建了一个自定义类型 class Setting public QObject Q OBJECT Q PROPERTY QString key READ key WRITE setKey Q PROPE

随机推荐

  • centos修改文件的最大打开数量

    我们首先先看一下我们现在的限制 root bogon ulimit n 1024 这肯定是不够的 所以我们要把这个数量给变成65535 首先我们一般查询到的方法是这个 ulimit n 65535 但是这个只能在本次开机有效 重启之后就不行
  • MATLAB算法实战应用案例精讲-【大模型】LLM算法(应用篇)

    目录 LLM推理加速 Medusa Medusa Marrying Simplicity with Efficiency 代码实现 参数配置 大模型LLM微调 微调方法 Freeze方法
  • http启动(重启)报错:Job for httpd.service failed because the control process exited with error code.

    http启动 重启 报错 Job for httpd service failed because the control process exited with error code See systemctl status httpd
  • JavaScript 中有趣的 9 个常用编码套路

    set对象 数组快速去重 常规情况下 我们想要筛选唯一值 一般会想到遍历数组然后逐个对比 或者使用成熟的库比如lodash之类的 不过 ES6带来了一个新玩意儿 它引入了一个全新的对象类型 Set 而且 如果结合上 展开运算符 我们可以超级
  • React 阻止默认事件和阻止冒泡

    给 a 标签添加一个事件 阻止默认事件 e preventDefault class view extends Component onAtag e 阻止默认事件 放置跳转 e preventDefault console log 烦烦烦滚
  • 防病毒服务器维护记录表,机房巡检记录表.doc

    机房巡检记录表 机房日常巡检记录表 值班人 值班时间 机房环境 检查项 结论 备注 检查项 结论 备注 温度 正常 异常 湿度 正常 异常 痕迹 正常 异常 清洁 正常 异常 异响 正常 异常 异味 正常 异常 门窗 正常 异常 照明 正常
  • noip模拟赛

    T1 给一个01矩阵 求一个最大子矩阵 矩阵内的和不超过k k leq n 2 n leq 500 sol O n 4 枚举左上角和右下角 发现后两维有单调性 可以用一个滑窗来搞 但其实非常优秀的枚举3个坐标然后二分第四个坐标的 O n 3
  • 黑盒白盒测试的区别

    一 黑盒测试 Black box Testing 黑盒测试也称功能测试 测试中把被测的软件当成一个黑盒子 不关心盒子的内部结构是什么 只关心软件的输入数据与输出数据 不看软件代码 只对功能进行测试 对软件进行操作 观察结果是否和我们想象的一
  • 【Python数据挖掘课程】五.线性回归知识及预测糖尿病实例

    今天主要讲述的内容是关于一元线性回归的知识 Python实现 包括以下内容 1 机器学习常用数据集介绍 2 什么是线性回顾 3 LinearRegression使用方法 4 线性回归判断糖尿病 前文推荐 Python数据挖掘课程 一 安装P
  • Ubuntu 20.04换国内源

    ubuntu默认的源是国处的源 更新下载速度较慢 因此安装好ubuntu20 04之后 将其源更新为国内的源 步骤如下 1 备份原始的源 源的路径 etc apt sources list 备份操作 cd etc apt cp source
  • 【电工技术】期末复习题

    1 电路是为实现人们的某种需求 由 电源 中间环节和负载三部分按一定方式组合起来 使电流流通的整体 2 在使用叠加定理对电路进行分析时 通常要对电源作除源处理 处理方法是将各个理想电压源 短接 将各个理想电流源 开路 3 利用戴维宁定理可以
  • 分析冰蝎三流量特征以及请求包

    1 使用wireshark获取冰蝎流量 首先在冰蝎中执行命令 捕捉流量 流量特征 可以看Accept字段的值 冰蝎脚本的这个请求值比较固定 还可以看user agent这个字段的值 还可以看content的值 2 分析流量 将数据包内容复制
  • 关于有些网站访问不了的问题

    1 网络攻击导致的 先要确定是不是仅仅一个用户的网页打不开 如果是一个用户的网页打不开 非常可能是这个网站的代码有问题 或许是域名没有分析好等原因 如果是大无数用户或全部用户的网页打不开 首要确定是不是攻击以致的 因为攻击有非常多种 例如C
  • 面试了一个00后,绝对能称为是内卷届的天花板

    前言 公司前段缺人 也面了不少测试 结果竟然没有一个合适的 一开始瞄准的就是中级的水准 也没指望来大牛 提供的薪资也不低 面试的人很多 但平均水平很让人失望 令我印象最深的是一个00后测试员 他技术基础方面确实还不错 面试也表现的非常自信
  • rsync服务

    文章目录 rsync简介 rsync特性 rsync的ssh认证协议 rsync命令 rsync简介 rsync是可以实现增量备份的工具 配合任务计划 rsync能实现定时或间隔同步 配合inotify或sersync 可以实现触发式的实时
  • 新一代树莓派 Raspberry Pi 2 性能测试之软件无线电追踪飞机信息

    新一代树莓派 Raspberry Pi 2 性能测试之软件无线电追踪飞机信息 转载自zza1003169 2015年02月28日 于 开源杂志 发表 安装开源软件无线电 GNU Radio 用电视棒追踪飞机轨迹 众所周知 树莓派 Raspb
  • Discuz!教程之当插件、门户或自定义页面设置成首页时手机版访问跳转到forum.php?mobile=yes的问题

    最近由于项目需要 将自定义单页设置为网站首页 测试过程中一直发现手机版无法访问 被强制跳转到了forum php mobile yes页面 仔细查看了一下Discuz 代码 source class discuz discuz applic
  • 免费python课程排行榜-重庆Python培训机构排行榜

    重庆千锋python全栈开发培训 0基础教学 带你玩转python开发 30天直追年薪20万 快速咨询 Python是一种非常强大的计算机语言 你可能已经听说过很多种流行编程语言 比如非常难学的C语言 非常流行的Java语言 适合初学者的B
  • Apollo如何通知/订阅主题topic

    转自 https blog csdn net u012423865 article details 80024870 How to advertise and subscribe a topic 导读 众所周知 Apollo是基于ROS开发
  • Qt5下串口对高频率自发性数据的接收及处理方法

    在项目中需要用Qt5 9采集仪表中的数据 仪表是以200Hz的频率主动向外连续发送数据 发送频率很高 而且主动发送 不需要软件发送一次 再读取一次 而是软件直接读取 这种直接连续读取 有两个关键点 1 如何从接收buffer里面查找出所需的