QT读取GPS信息,信息组包,防止异常错乱

2023-05-16

以下如果有错误,请留言指正;

GNRMC为双模定位:GPRMC + BD

读取$GNRMC经纬度信息; 含GPRMC;

处理类似$GNRMC,064401.65,A,3110.4706987,N”
"110.3568,E,0.604,243.2,30,0713,0.0,W,A*3E”或者$GNRMC信息一包不完整的情况,不然程序会偶发宕机;

工程.pro文件中需要添加如下库:

QT += serialport

头文件引用

头文件引用
#include <QSerialPort>
#include <QSerialPortInfo>

private slots:
     void serialRead();

private:
    QSerialPort serial;//串口实例
    bool sFinished; //标记上一次GPS数据是否解析完成
    QString GpsMsg ; //gps数据组包使用

private:
    void gpsParse(QByteArray GPSBuffer);//gps解析函数 

实现cpp

初始化过程,加入到你初始化方法即可

serialReadFinished = true; //标记上一次GPS数据是否解析完成
connect(&serial,SIGNAL(readyRead()),this,SLOT(serialRead()));   //连接槽

    QSerialPortInfo info;
     QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();
     bool ifd = false;
     foreach (info, infos) {
         if(info.portName() == "COM1"){
           ifd = true;
           break;  //你的串口号比如 COM1
         } 
     }

     if(true == ifd){//can find
        ui->textBrowser1->append("串口打开成功");

         serial.close();
         serial.setPort(info);
         serial.open(QIODevice::ReadWrite);   //可以改成ReadOnly     
         serial.setBaudRate(9600);//波特率

    //      serial.setBaudRate(QSerialPort::Baud9600);  //波特率
    //      serial.setDataBits(QSerialPort::Data8);     //数据位
    //      serial.setParity(QSerialPort::NoParity);    //无奇偶校验
    //      serial.setStopBits(QSerialPort::OneStop);   //无停止位
    //      serial.setFlowControl(QSerialPort::NoFlowControl);  //无控制
     }else{
         serial.close();
         ui->textBrowser1->append("串口打开失败");
     }

void MainWindow::serialRead()
 {
     QByteArray qa = serial.readAll();
     gpsParse(qa);
 }

void MainWindow::gpsParse(QByteArray GPSBuffer)
 {

    if(false == sFinished){
        return;
    }

    sFinished= false;
    QString GPSBufferString = QString( GPSBuffer );

    //处理数据粘包过程 contains
    if(GPSBufferString.startsWith("$GNRMC") || GPSBufferString.startsWith("$GPRMC") ){
        GpsMsg = GPSBufferString;
    }else{
            if(!GpsMsg .isEmpty()){
                GpsMsg = GpsMsg .append(GPSBufferString);
            }
    }

    if((GPSBufferString.startsWith("$GNRMC") || GPSBufferString.startsWith("$GPRMC")) && (GpsMsg .count(",") >= 12 ) )
     {
         QByteArray bytes = GpsMsg .toUtf8();
         //ui->textBrowser1->append("p0:"+bytes);
         QList<QByteArray> gpsByteArrays = bytes.split(',');
//         int count = gpsByteArrays.count();
         
         if("V" == gpsByteArrays.at(2)){
            qDebug() << "V invalid positioning ;";
         }else{
             int  gpsLat_1 = static_cast<int>(gpsByteArrays.at(3).toDouble()/100);
             double gpsLat_2 = (gpsByteArrays.at(3).toDouble() - gpsLat_1 * 100)/60;
             double gpslat=gpsLat_1 + gpsLat_2;

             int gpsLong_1 = static_cast<int>(gpsByteArrays.at(5).toDouble()/100);
             double gpsLong_2 = (gpsByteArrays.at(5).toDouble()-gpsLong_1 * 100)/60;
             double gpsLong = gpsLong_1 + gpsLong_2;
             std::cout<<"经度:"<<QString::number(gpslat,'g',9)<<endl;
             std::cout<<"维度:"<<QString::number(gpsLong,'g',10)<<endl;

             if(!gpsByteArrays.at(8).isEmpty())
                ui->textBrowser1->append("p4:" +gpsByteArrays.at(8));
         }
        
         GpsMsg = "";
    }

    sFinished = true;
}

已过有问题 可以留言哦,共同学习~~~

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

QT读取GPS信息,信息组包,防止异常错乱 的相关文章

  • 根据 GPS 坐标计算 PNG 地图上的 X 和 Y 位置

    我正在 iPhone 应用程序上实现自定义地图 尺寸为 map width 和 map height 的图像 并尝试在该地图上显示当前用户位置 current long 和 current lat 我有 2 个参考点 具有已知的 GPS 坐
  • Android 将阿拉伯数字转换为英文数字

    我从 GPS 收到以下错误 Fatal Exception java lang NumberFormatException Invalid double 现在 这是我通过 Fabric 从用户处收到的错误 它看起来像阿拉伯语 所以我猜只有当
  • 使用 Android.Xamarin 查找纬度和经度

    我正在尝试在 Android Xamarin 中开发商店定位器应用程序 我的第一步是找到我所在位置的纬度和经度 但我的模拟器 设备屏幕没有显示任何内容 我有我的uses permissions set to
  • 在带有校准点的地图上将经度和纬度转换为 X Y

    如果我有一张尺寸为 sizeX sizeY 的 jpeg 地图 以及地图上的一些校准点 X Y 经度 纬度 使用给定的经度 纬度对计算地图中相应 XY 点的算法是什么 这对我有用 没有那么多废话 int x int MAP WIDTH 36
  • 如何确定当前用户位置是否在我的 MKCooperativeRegion 内?

    我有一个坐标区域 我已确定该区域包含我想要为我的应用程序显示的内容的限制 我已将其设置为具有中心点纬度 经度和跨度的 MKCooperativeRegion 如何确定当前 userLocation 是否在我的坐标区域内 使用地图矩形 这是使
  • 我如何从 JMapViewer 世界地图中获取鼠标单击位置

    我正在使用地图浏览器 http wiki openstreetmap org wiki JMapViewerjar 在 JPanel 上显示世界地图 在地图上我添加MapMarkerDot s这是 GPS 点 问题是当我单击MapMarke
  • 设置模拟位置时 GPS 提供商未知错误?

    我正在尝试设置我的模拟位置 但是 我收到以下错误 提供商 gps 未知 并且不确定出了什么问题 我已经获得了在manifest xml 中声明的所有权限以及所有参数 模拟定位法 Initiates the method to set the
  • 在设备所有者应用程序中启用 GPS

    根据API文档 https developer android com reference android app admin DevicePolicyManager html setSecureSetting android conten
  • Android GPS 的准确度如何? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我好像在某处读过Android的GPS精度约为10厘米 任何人都可以验证或更正这个吗 原因是我正在尝试开发的应用程序会跟踪用户访问过的位置 这将极大地
  • Android 中如何在不使用 getLastKnownLocation 方法的情况下获取当前的纬度和经度?

    我正在尝试获取current手机的位置 为此我使用GPS追踪器教程 http www androidhive info 2012 07 android gps location manager tutorial 问题总是使用该方法getLa
  • 根据步行速度在 2 个 GPS 位置之间进行插值

    Problem 给定两个位置 L1 latitude1 longitude1 timestamp1 L2 latitude2 longitude2 timestamp2 以及可配置但恒定的移动速度 v 1 39 米每秒 例如 How can
  • 帮助使用 GPS 坐标,Android

    我正在使用此代码来获取我的位置并在屏幕上打印坐标 package com example alpha import android app Activity import android content Context import and
  • 如何知道jar文件是否已经在运行?

    经过谷歌研究后 我找到了很好的答案 例如 1 using jps or jps l让 jars 在 JVM 下运行 这个答案可以 但是如果用户根本没有安装java并且我使用例如 bat文件和带有java JRE的文件夹运行我的jar 另外
  • Android 查找 GPS 位置一次,显示加载对话框

    我正在编写一个应用程序 它需要用户的当前位置 lastknownlocation 不会很有帮助 并显示从数据库中获取的所有最接近的 项目 的列表 我已经找到了最近的项目 效果很好 但暂时只使用硬编码的纬度和经度位置 但现在是时候实现查找实际
  • 使用 Google 电子表格中的脚本从手机获取我的当前位置

    有没有办法使用 Google Apps 脚本从手机的 GPS 数据中获取我的当前位置 纬度和经度 最好是十进制形式 另外 是否可以打开和关闭 GPS 或者至少检测它是否打开或关闭 这是我尝试做的 我带着电动助力车去一些地方 在每个地方我都会
  • 使用 iPhone 版 gmap 中的经纬度计算两个地点之间的距离 [重复]

    这个问题在这里已经有答案了 可能的重复 GPS 坐标 以度为单位 来计算距离 https stackoverflow com questions 6994101 gps coordinates in degrees to calculate
  • 检测wifi是否启用(无论是否连接)

    对于 GPS 跟踪应用程序来说 在打开 WIFI 的情况下记录位置信号会导致数据非常不精确或存在间隙 在开始跟踪之前 我已使用可达性查询来检测 wifi 是否可用 问题是 如果进行该查询时 wifi 已启用但未连接到网络 则表明无法通过 w
  • 关闭应用程序后如何调试

    我正在尝试重现问题 这需要在特定位置关闭并重新打开我的应用程序 这是我的问题 1 如何查看我的日志 使用NSLog命令 当我的 iPhone 未连接到 XCode 时 2 是否可以将iPhone模拟器的特定位置 例如市中心 设置为默认位置
  • Fused Location Provider 是不错的选择吗?

    我正在开发一个应用程序 我想在其中使用融合位置提供程序 但我有一些疑问 还有几个问题 当 GPS 关闭并且我将优先级设置为 HIGH 时 是否意味着 GPS 会自动打开 我可以根据需要将 UpdateLocation 设置为具有高优先级的
  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆

随机推荐

  • 基于Python socket利用TCP协议让上下位机 传输图片

    基于Python socket利用TCP协议让上下位机 传输图片 Notes 1 原理2 下位机代码 xff1a 3 上位机代码 xff1a Notes 之前用来做 基于QT 的物联网图形化软件的其中一个功能 xff0c 因为在这遇到过许多
  • Java中的final变量、final方法和final类

    1 final变量 final关键字可用于变量声明 xff0c 一旦该变量被设定 xff0c 就不可以再改变该变量的值 通常 xff0c 由final定义的变量为常量 例如 xff0c 在类中定义PI值 xff0c 可以使用如下语句 xff
  • 音视频开发技术的进阶路线

    1 音视频开发包括哪些内容 虽然一篇文章无法把音视频开发的知识点都介绍清楚 xff0c 但是大概的学习路线还是可以梳理一下的 xff0c 我们先看看下面这张图 xff1a 其实说白了 xff0c 音视频开发 xff0c 就是要掌握图像 音频
  • Ubuntu22.04应用程序启动时闪退

    Ubuntu22 04启动应用程序时闪退 xff0c 添加程序启动时参数解决 今天尝试在ubuntu安装QQ音乐 xff0c 安装后启动时弹出一下就闪退了 命令行启动程序 xff0c 报错 xff1a FATAL gpu data mana
  • STM32CubeMX上手初体验

    STM32CubeMX 提起嵌入式开发常用的IDE xff0c 你都用过哪些 xff1f 相信大家都用过keil xff0c 它上手简单 xff0c 许可证也可以通过众所周知的途径拿到 IAR有些小伙伴也用过 xff0c 它功能强大 xff
  • 学习ucosii要用到的几本书和软件

    原帖地址 xff1a http bbs ednchina com BLOG ARTICLE 2020186 HTM 打算学习一个嵌入式操作系统 xff0c 研究了一下决定还是先研究一下ucosii xff0c 一方面权当学习C语言 xff0
  • Linux防火墙——Firewalld基础命令

    Firewalld概述 Firewalld简介 xff08 1 xff09 支持网络区域所定义的网络连接以及接口安全的动态防火墙管理工具 xff08 2 xff09 支持IPv4 IPv6防火墙设置以及以太网桥接 xff08 3 xff09
  • 本地服务调用 K8S 环境中的 SpringCloud 微服务实战

    常规手段 xff1a 通过 service 访问对应的 pod 通常情况下 xff0c 从外部访问 kubernetes 内部 pod 服务的方法是创建 service xff0c 再通过访问 service 的方式来访问对应的 Pod x
  • Azure Redhat挂载盘操作导致重启后无法ssh登录

    问题 在Azure环境中创建了一台 Redhat VM xff0c 挂载了一块128GB新盘 xff0c 晚上stop后 xff0c 第二天start后无法ssh登录 发现问题过程 进入虚拟机信息页面 2 进入左侧 Support 43 T
  • KCF目标跟踪

    ROS调包侠 KCF目标跟踪 项目说明 参考项目 xff1a GitHub TianyeAlex tracker kcf ros 基于ros下应用深度相机的kcf追踪算法实现 修改内容 xff1a 1 解决原作者使用OpenCV版本比较老
  • 如何查看go依赖包的license (glice)

    Reference https github com ribice glice Installation Download and install glice by executing go install github com ribic
  • MINIO PutObject (erasureServerPools)源码分析

    实验环境 xff1a MINIO 源码版本 xff1a RELEASE 2021 04 22 minio server 后跟四块盘 一个erasureServerPool 1个erasureSet xff0c 4个Drives 2个Data
  • VNC 的应用及灰屏鼠标变X问题

    Ubuntu中vnc服务器端的安装很简单 xff0c 运行如下命令 xff1a sudo apt get install vnc4server 第一次启动vncserver后 xff0c 在用户家目录中会生成 vnc 目录 xff0c 注意
  • Intel VT-x enabled 却无法打开64位虚拟机

    情景 xff1a 机型 xff1a 联想 T430 前些天运行64位虚拟机没有问题 xff0c 今天打开却跳出无法执行64位操作 xff0c 很是诧异 便根据提示进行检查 BIOS中Virtual Technology 虚拟技术已打开 xf
  • Valgrind:failed to start tool 'memcheck' for platform 'x86-linux': No such file or directory

    引文 xff1a Valgrind安装与使用Ubuntu下添加环境变量方法 问题 通过 configure prefix 61 where you want to install将Valgrind安装到自己希望的目录安装Valgrind 3
  • hp z840 上安装ESXi

    ESXi安装 镜像下载 VMware viclient all 5 1 0 2306356 exe VMware ESXi 5 1 0 Update3 2323236 HP 510 9 4 24 Nov2015 iso VMware ESX
  • ESXi 6.0 中虚拟机拷贝(克隆)

    情况一 xff1a 拥有一台配置好的虚拟机 xff0c 想通过clone方式复制多台虚拟机来进行模糊测试 xff0c 但是vSphere Client 6 0没有提供克隆虚拟机功能 xff08 可能收费版拥有吧 xff09 解决方法 xff
  • Vmware 虚拟机瘦身

    问题 vmware 占用硬盘空间只增大不减少 即使删除虚拟机系统里面的文件 xff0c 占用宿主机的硬盘空间也不释放 导致虚拟机越来越大 xff01 方法一 xff1a 运用虚拟机自带的磁盘整理工具来进行磁盘清理 xff01 1 虚拟机 g
  • 从peach源码生成工程文件

    编译过程中几个软件 msvc Microsoft Visual C 43 43 often abbreviated as MSVC or VC 43 43 is an integrated development environment I
  • QT读取GPS信息,信息组包,防止异常错乱

    以下如果有错误 xff0c 请留言指正 GNRMC为双模定位 xff1a GPRMC 43 BD 读取 GNRMC经纬度信息 xff1b 含GPRMC xff1b 处理类似 GNRMC 064401 65 A 3110 4706987 N