QT实现NMea截取指定片段字符串——$GNGGA(小白第一次编,后期有机会完善代码,高勿)

2023-05-16

总体思路:

1.读取所有数据(readAll())

QByteArray readbuf = serial->readAll();

2.查找标志位(QString中使用indexOf(“GNGGA”)——因为我需要GNGGA下经纬度及海拔高度,因此我识别数据头“GNGGA”,数据尾“GNGSA”)

    QString tmpreadbuf = QString(readbuf);  //放入QString中
    int positionstart = tmpreadbuf.indexOf("$GNGGA"); //查找数据头起始位(这里是$的位置,因为查找字符串只表示字符串第一位的位置)
    int positionend = tmpreadbuf.indexOf("$GNGSA"); //查找数据尾(这里是$的位置)

3.截取片段(QString中使用mid()截取,第一个参数:数据起始位;第二个参数:截取长度)

    QString substring = tmpreadbuf.mid(positionstart,positionend-positionstart);

4.开始解析具体数据

完整头 文件Recv.hpp(时间紧迫,用的旧上位机,可能有未删除部分,不影响结果)

#ifndef RECV_HPP
#define RECV_HPP

#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QString>
#include <QDebug>
#include <QMutex>
#include <QFile>
#include <QTimer>
#include <QDateTime>

namespace Ui {
class Recv;
}

class Recv : public QMainWindow
{
    Q_OBJECT

public:
    explicit Recv(QWidget *parent = nullptr);
    ~Recv();
    char convertHex2Char(char ch);

private slots:
    void onOpenserialbuttonClicked();
    void readData();

private:
    Ui::Recv *ui;
    QSerialPort *serial;
    QTimer* m_serialhnltm;
};

#endif // RECV_HPP

完整Recv.cpp文件(旧上位机改版,部分未删除,不影响结果,时间紧迫,后期看看能不能注释,精编代码)

#include "recv.hpp"
#include "ui_recv.h"
#include <QString.h>
#include <QMutex>
#include <string>
#include <iostream>

QMutex gmux;
int validlength = 0;
unsigned char *buf;

QString hexToString(unsigned char *in, int len)
{
    int i;
    unsigned char inChar,hi,lo;
    QString s;

    for (i=0; i<len; i++)
    {
        inChar = in[i];

        hi = (inChar & 0xF0) >> 4;
        if (hi > 9)
            hi = 'A' + (hi - 0x0A);
        else
            hi += 0x30;
        s.append(hi);

        lo = inChar & 0x0F;
        if (lo > 9)
            lo = 'A' + (lo - 0x0A);
        else
            lo += 0x30;
        s.append(lo);

        s.append(0x20);
    }

    return s;
}


Recv::Recv(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Recv)
{
    ui->setupUi(this);

    ui->comboBox_uartselect->addItem("COM1");
    ui->comboBox_uartselect->addItem("COM2");
    ui->comboBox_uartselect->addItem("COM3");

    ui->comboBox_uartbaud->addItem("9600");
    ui->comboBox_uartbaud->addItem("19200");
    ui->comboBox_uartbaud->addItem("38400");
    ui->comboBox_uartbaud->addItem("115200");
    ui->comboBox_uartbaud->addItem("921600");
    ui->comboBox_uartbaud->setCurrentIndex(2);

    QObject::connect(ui->pushButton_uartopen,SIGNAL(clicked()),this,SLOT(onOpenserialbuttonClicked()));
    m_serialhnltm = new QTimer(this);
    //QObject::connect(m_serialhnltm,SIGNAL(timeout()),this,SLOT(handletimeout()));
}

Recv::~Recv()
{
    delete ui;
}

char Recv::convertHex2Char(char ch)
{
    if((ch>='0')&& (ch<='9')){
        return ch-0x30;
    }else if((ch>='A') && (ch<='F')){
        return ch-'A'+10;
    }else if((ch>='a') && (ch<='f')){
        return ch-'a'+10;
    }else{
        return (-1);
    }
}

void Recv::onOpenserialbuttonClicked()
{
    if(ui->pushButton_uartopen->text() == tr("打开串口"))
    {
        serial = new QSerialPort;
        serial->setPortName(ui->comboBox_uartselect->currentText());
        int ret = serial->open(QIODevice::ReadWrite);

        serial->setBaudRate(ui->comboBox_uartbaud->currentText().toInt());

        serial->setDataBits(QSerialPort::Data8);
        serial->setParity(QSerialPort::NoParity);
        serial->setStopBits(QSerialPort::OneStop);
        serial->setFlowControl(QSerialPort::NoFlowControl);

        ui->comboBox_uartselect->setEnabled(false);
        ui->comboBox_uartbaud->setEnabled(false);
        ui->pushButton_uartopen->setText(tr("关闭串口"));
        QObject::connect(serial,&QSerialPort::readyRead,this,&Recv::readData);
        m_serialhnltm->start(10);
    }
    else
    {
        serial->clear();
        serial->close();
        serial->deleteLater();

        //恢复设置使能
        ui->comboBox_uartselect->setEnabled(true);
        ui->comboBox_uartbaud->setEnabled(true);
        ui->pushButton_uartopen->setText(tr("打开串口"));
        m_serialhnltm->stop();
    }
}


void Recv::readData()
{
    QByteArray readbuf = serial->readAll();
    QString disp_string_latitude;
    QString disp_string_NS;
    QString disp_string_longitude;
    QString disp_string_WE;
    QString disp_string_altitude;
    QString disp_string_unit;

    
    QString tmpreadbuf = QString(readbuf);
    int positionstart = tmpreadbuf.indexOf("$GNGGA");
    //qDebug()<<"recv: "<<positionstart;
    int positionend = tmpreadbuf.indexOf("$GNGSA");
    QString substring = tmpreadbuf.mid(positionstart,positionend-positionstart);
    QStringList strList = substring.split(",");
    //qDebug()<<"size: "<<strList.size();
    int i = 0;
    if(strList[i]!=NULL)
    {
        qDebug()<<"strList: "<<strList;
        disp_string_latitude = QString("%1").arg(strList[2]);
        
        /*解析纬度及南北半球*/
        QString disp_string1 = disp_string_latitude.mid(0,2);
        QString disp_string2 = disp_string_latitude.mid(2);
        double data1=disp_string1.toDouble();
        double data2=disp_string2.toDouble();
        double data = data1+data2/60;
        QString disp_string = QString::number(data,'f',6);
        disp_string = QString("纬度是: %1").arg(disp_string);//在string类型中写其他内容
        //qDebug()<<"recv: "<<disp_string;
        disp_string_NS = QString("纬度半球: %1").arg(strList[3]);

        /*解析东西半球*/
        disp_string_longitude = QString("%1").arg(strList[4]);
        QString disp_string3 = disp_string_longitude.mid(0,3);
        QString disp_string4 = disp_string_longitude.mid(3);
        double data3=disp_string3.toDouble();
        double data4=disp_string4.toDouble();
        double data5 = data3+data4/60;
        QString disp_string5 = QString::number(data5,'f',6);
        disp_string5 = QString("经度是: %1").arg(disp_string5);
        //qDebug()<<"recv: "<<disp_string4;
        disp_string_WE = QString("经度半球: %1").arg(strList[5]);

        /*海拔高度解析*/
        disp_string_altitude = QString("海拔高度: %1").arg(strList[9]);
        disp_string_unit = QString("海拔高度单位: %1").arg(strList[10]);

        ui->textBrowser_recv->append(disp_string);
        ui->textBrowser_recv->append(disp_string_NS);
        ui->textBrowser_recv->append(disp_string5);
        ui->textBrowser_recv->append(disp_string_WE);
        ui->textBrowser_recv->append(disp_string_altitude);
        ui->textBrowser_recv->append(disp_string_unit);
    }


    readbuf.clear();
}

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

QT实现NMea截取指定片段字符串——$GNGGA(小白第一次编,后期有机会完善代码,高勿) 的相关文章

  • EuRoC数据集介绍

    数据集官网 xff1a https projects asl ethz ch datasets doku php id 61 kmavvisualinertialdatasets EuRoC数据集 微型飞行器 xff08 MAV xff09
  • TUM数据集

    TUM数据集下载链接 https vision in tum de data datasets rgbd dataset download https vision in tum de data datasets visual inerti
  • evo评测VINS-MONO---指标解析、算法精度分析(数据集)

    上篇博文已通过代码修改 数据格式转换 数据测试实现使用evo评测VINS MONO xff0c 该篇将详细介绍evo评测出的数据指标 xff0c 以及VINS MONO在数据集下的精度情况 EVO评价指标介绍 绝对轨迹误差 xff08 AT
  • ZED2相机说明书

    经前期调研及摄像头参数对比 xff0c 最终选择STEREOLABS公司的ZED2双目立体摄像头作为后期VINS系统的硬件平台 xff0c 下面先给出ZED2 的产品说明书 产品特点 1 空间目标检测 根据空间环境检测和跟踪对象 通过结合A
  • 解决NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver

    问题解决 终端输入 xff1a nvidia smi NVIDIA span class token operator span SMI has failed because it couldn span class token numbe
  • Mysql 事务(标贝科技)

    文章目录 事务InnoDB对ACID的支持隔离级别不同隔离级别下读读取数据可能出现的情况不可重复读和幻读区别 redo log xff08 共享表空间 xff09 redo log block刷redo log策略 xff1a innodb
  • Ubuntu20.04运行Vins-fusion

    因已安装ROS noetic xff0c eigen xff0c opencv及ceres等库 xff0c 这部分环境配置就不细讲 xff0c 直接下载VINS FUSION的代码库 下载编译 cd span class token ope
  • 坐标系之间的转换关系(ECEF、LLA、ENU)

    一 坐标系简介 1 ECEF坐标系 也叫地心地固直角坐标系 其原点为地球的质心 xff0c x轴延伸通过本初子午线 xff08 0度经度 xff09 和赤道 xff08 0deglatitude xff09 的交点 z轴延伸通过的北极 xf
  • Python画图常用的颜色及标识

    matplotlib中color可用的颜色 xff1a aliceblue F0F8FF antiquewhite FAEBD7 aqua 00FFFF aquamarine 7FFFD4 azure F0FFFF beige F5F5DC
  • .npy文件打开方式

    在用evo评测slam算法定位精度时 xff0c 使用 save results a zip 生成的结果中包含的 npy文件 xff0c 如果要查看里面详细的数值 xff0c 则可通过以下方式打开文件并查看 1 xff09 找到要查看的 n
  • IMU误差模型简介及VINS使用说明

    1 IMU误差来源 2 IMU噪声模型 Noise and Bias kalibr中的imu noise model 参考 xff1a https github com ethz asl kalibr wiki IMU Noise Mode
  • 泰勒公式(泰勒展开式)通俗介绍+本质详解

    比较通俗地讲解一下泰勒公式是什么 泰勒公式 xff0c 也称泰勒展开式 是用一个函数在某点的信息 xff0c 描述其附近取值的公式 如果函数足够平滑 xff0c 在已知函数在某一点的各阶导数值的情况下 xff0c 泰勒公式可以利用这些导数值
  • Leetcode ->94 二叉树的中序遍历

    题目 算法思路及代码实现 span class token macro property span class token directive hash span span class token directive keyword inc
  • Unix、UTC、GPS时间戳及转换

    UTC时间 UTC时间的英文全称 xff1a Universal Time Coordinated xff0c 中文名称 xff1a 协调世界时 俗的理解为 xff0c 这个时间是全世界通用的 xff0c 即全世界都公用的一个时间 可以认为
  • 自动驾驶中地图匹配定位技术总结

    引言 汽车定位是让自动驾驶汽车知道自身确切位置的技术 xff0c 在自动驾驶系统中担负着相当重要的职责 汽车定位涉及多种传感器类型和相关技术 xff0c 主要可分为卫星定位 惯性导航定位 地图匹配定位以及多传感器融合定位几大类 其中地图匹配
  • Firefox 常用扩展插件及脚本推荐 打造你不一样的Firefox

    前言 xff1a 进入2011年以来 xff0c 整个浏览器领域的竞争越发激烈 xff0c 随着IE9正式版的发布 Chrome Opera等浏览器厂商也相继更新 发布了新的版本 经过多次跳票之后 xff0c FireFox4 0正式版终于
  • mysql 锁(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 mysql 锁 锁类型 类型 表级锁 xff1a 开销小 xff0c 加锁快 xff1
  • STM32G4学习笔记之DAC+FMAC

    1 高性能DAC G4系列一共有四个DAC 前两个为低速采集DAC xff08 1MHz xff09 xff0c 后两个为高速 可达15MHz DAC1 DAC2的采样速率最大为1MHz xff0c DAC3 DAC4的采样速率最大为15M
  • 逆变电路之单极性调制与双极性调制

    就调制脉冲的极性而言 单相全桥逆变器pwm调制技术主要分为单极性调制与双极性调制 下面就其调制原理分别做简单的介绍 1 单极性调制 单极性调制的原理如图所示 调制信号ur为正弦波 载波uc在ur的正半周为正极性的三角波 在ur的负半周 为负
  • OTL电路与OCL功放电路的区别

    一 OTL电路 OTL xff08 Outputtransformerless xff09 电路是一种没有输出变压器的功率放大电路 过去大功率的功率放大器多采用变压器耦合方式 xff0c 以解决阻抗变换问题 xff0c 使电路得到最佳负载值

随机推荐

  • 运放失真罪魁祸首之压摆率和增益带宽积

    1 什么叫压摆率 xff1f 做1pps驱动电路 1 xff0c 1PPS xff1a 秒脉冲英文全称 xff1a Pulse Per Second 1pps概念 要求上升沿 5ns xff0c FPGA输出的信号用运放跟随增强驱动后 xf
  • 电源反馈电路设计经验(PC817光耦隔离+TL431)

    身边的很多小伙伴好像都对电源的反馈电路的计算以及原理不太了解 xff0c 这里给大家系统的讲解一下 xff1a 废话不都说 xff0c 咱们直接上干货 在分析电路前需要注意的关键点 1 光耦的输入端 xff08 二极管端 xff09 的电流
  • 一分钟带你了解常用的V-I、I-V转换电路

    下面我将给大家介绍6种常用的V I I V转换电路 1 0 xff0d 5V 0 xff0d 10mA的V I变换电路 图1是由运放和阻容等元件组成的V I变换电路 xff0c 能将0 5V的直流电压信号线性地转换成0 xff0d 10mA
  • 奈奎斯特采样定理-为什么采样率需要时被测信号最高频率的两倍

    奈奎斯特采样定理 采样定理在1928年由美国电信工程师H 奈奎斯特首先提出来的 xff0c 因此称为奈奎斯特采样定理 1933年由苏联工程师科捷利尼科夫首次用公式严格地表述这一定理 xff0c 因此在苏联文献中称为科捷利尼科夫采样定理 19
  • 傅里叶变换简单解析

    这里有两个频率 一个是信号本身的频率 位1 3sec 一个下面矢量绕圆的频率 为1 0 79sec 下面这个频率是我们可以改变的 这就是所谓的窗 即我们选取多长的一段信号用来进行傅里叶变换分析 当截取的窗的周期等于信号周期1 3sec时 就
  • 组合逻辑与时序逻辑

    我前段时间对这两个逻辑的概念有点混淆 xff0c 所以就百度查看了一下 xff0c 排名第一的结果就出现了这样的解释 xff1a 数字电路根据逻辑功能的不同特点 xff0c 可以分成两大类 xff0c 一类叫组合逻辑电路 xff08 简称组
  • AD2020如何安装库

    首先快捷键op打开下面界面 然后找到库的位置安装就可以了
  • 白话Android音频系统原理(上)(标贝科技)

    白话Android音频系统原理 xff08 上 xff09 一 基本原理二 初始化准备工作三 播放流程四 录音流程 标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0
  • keil 工程头文件包涵及结构体重定义问题

    最近在写一个太阳能电池控制板的项目 xff0c 这两天真是收获颇丰 xff0c 把指针又从新学了一遍 xff0c 还是项目坑死人啊啊啊啊啊 下面是我在建立工程时遇到的问题 xff1a 1 头文件包涵问题 xff1a 原先写的程序都是小程序
  • Openmediavault 4.1.3 镜像下载地址

    Openmediavault 4 1 3 镜像下载地址 https nchc dl sourceforge net project openmediavault 4 1 3 openmediavault 4 1 3 amd64 iso
  • 【leetcode】【77】Combinations

    一 问题描述 Given two integers n and k return all possible combinations of k numbers out of 1 n For example If n 61 4 and k 6
  • 激光雷达介绍

    全球汽车行业正在进行自动化变革 xff0c 这将彻底改变交通运输的安全和效率水平 戴姆勒在S级豪华车型中引入L3级自动驾驶 xff08 L3 xff0c 在特定条件下自动驾驶 xff0c 人类驾驶员一旦被请求就会随时接管 xff09 是自动
  • get请求 包括username和password

    方法一 xff1a public static String wisdomNetMessagePlat String sn String encoding throws Exception String result 61 34 34 St
  • Arduino控制L298N

    一般做智能小车或者DIY开发的童鞋需要用到Arduino这狂开发板 xff0c 作为一名好奇心很强的软件开发人员 xff0c 我自然也想尝尝鲜特别是利用Arduino做一些人机交互的项目 xff0c 如果结合了Kinect AR增强现实 x
  • gitlab打tag的作用,以及如何基于tag切分支

    在 GitLab 中 xff0c Tag 是将 Git 项目中特定的提交标记为版本的一种方式 Tag 能够用于标记发布的版本 xff0c 以便于对代码的每个版本进行管理和追踪 打 Tag 的作用主要有以下几点 xff1a 标记版本发布 xf
  • 解析包含用户名密码的FTPURL

    include lt stdio h gt include lt string h gt void parse ftpurl char url char user char passwd char ipaddr uint port char
  • nvidia jetson xavier nx Deepstream Yolov3示例模型运行

    最近在玩nvidia jetson xavier nx的板子 xff0c 特在此做一些笔记 1 进入sample目录 cd opt nvidia deepstream deepstream sources objectDetector Yo
  • go-mysql-elasticsearch+mysql 同步 ElasticSearch(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 一 Elasticsearch xff1a https www elastic co
  • Intel Realsense D400系列相机自校准细节,减少踩坑!!

    自校准 xff08 对任意环境非白墙 注意距离0 4 2米之间 xff0c 深度 xff08 相机拍摄内容中物体所占空间 xff09 50 xff09 xff1a 打开Intel realSense viewer xff1a 连接设备 xf
  • QT实现NMea截取指定片段字符串——$GNGGA(小白第一次编,后期有机会完善代码,高勿)

    总体思路 xff1a 1 读取所有数据 xff08 readAll xff08 xff09 xff09 QByteArray readbuf 61 serial gt readAll 2 查找标志位 xff08 QString中使用inde