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信息,信息组包,防止异常错乱 的相关文章

  • Java中的多点三边测量算法

    我正在尝试在我的 Android 应用程序中实现三边测量算法来确定用户的室内位置 我正在使用超宽带信标来获取到固定点的距离 我能够采用中建议的方法三边测量法 Android Java https stackoverflow com ques
  • GMSPolyline 非常大的内存峰值

    在允许用户在各种不同类型的地图上显示我们称之为轨迹的复杂位置点列表的 GPS 应用程序中 每个轨迹可以包含 2k 到 10k 个位置点 当轨迹在非 Google 地图类型上呈现时 它们会被大量剪切 修剪和路径简化 这是为了降低内存使用量并提
  • 寻找另一部智能手机的笛卡尔坐标?

    考虑到我有两部智能手机 A 和 B 如果我拿着智能手机 A 有没有办法确定 B 相对于我自己的位置 所以如果我们有这张图片的情况 它会告诉我 B 位于位置 2 1 利用 WiFi 信号强度来获取位置等创造性方法更受欢迎 我还可以确定两部手机
  • 在没有互联网的情况下使用 Javascript 获取 GPS 位置 [重复]

    这个问题在这里已经有答案了 您好 如果设备具有 GPS 硬件 我们可以在没有互联网连接的情况下使用 JavaScript 获取 GPS 位置吗 请注意谁将其标记为重复 我需要 JavaScript 在没有互联网连接的情况下工作 并使用 GP
  • GPS 坐标(以度为单位)来计算距离

    在iPhone上 我以十进制度数获取用户的位置 例如 纬度39 470920和经度 0 373192 也就是A点 我需要用另一个 GPS 坐标 同样以十进制表示 B 点创建一条线 然后 计算从 A 到 B 的线与另一个点 C 之间的距离 垂
  • 谷歌地图定位是如何工作的?

    我的问题是谷歌地图或移动 GPS 如何找到我的当前位置 读完本文后我的高层次理解article http www physics org article questions asp id 55就是 GPS接收器通过这些卫星获取位置坐标 该位
  • 使用 iPhone 版 gmap 中的经纬度计算两个地点之间的距离 [重复]

    这个问题在这里已经有答案了 可能的重复 GPS 坐标 以度为单位 来计算距离 https stackoverflow com questions 6994101 gps coordinates in degrees to calculate
  • 如何在 Android 中像 Google 地图一样获得持续的位置更新?

    我正在构建一个朋友跟踪 Android 应用程序 当我的朋友激活应用程序并带着他的 GPS 和蜂窝数据离开时 我需要在我的设备上跟踪他 这就是这个概念 我已经实现了 LocationListener 类 现在我可以从 Gps 或网络获取最后
  • iPhone 网络应用程序可以获取 GPS 位置吗?

    有没有一种简单的方法来设计一个网站来促进iphone用户提供gps网站坐标 我想知道表单字段是否有命名约定 例如 让用户以自动方式输入 我正在考虑建立一个基于位置的网站 并希望为 iPhone 和其他移动用户 量身定制 我意识到 iPhon
  • Java Marine API - 寻找 NMEA 数据

    我的最终目标是从 Adafruit Ultimate GPS NMEA 0183 标准 接收纬度和经度 GPS 信息到我的 Java 应用程序 我正在使用 Java Marine API 来执行此操作 然后 当前位置将与时间戳一起写入数据库
  • 向 tk103 GPS 跟踪器发送命令

    我正在使用 php 开发实时 GPS 跟踪器 Web 应用程序 跟踪器参考号是tk103 我可以从跟踪器接收信息并将其存储到数据库中 设备的 GPRS 模式已启用 我的问题是 如何使用 php ini 将命令从服务器发送到设备 提前致谢 这
  • 如何创建在 React-Native 中检测自动位置的地图

    我已经在react native中创建了地图 参考https github com lelandrichardson react native maps https github com lelandrichardson react nat
  • Ruby on Rails:如何使用 TCP 套接字连接 GPS 设备

    ruby 2 3 0p0 2015 12 25 修订版 53290 x86 64 linux 轨道 4 2 4 我正在使用 cloud9 IDE 和 webrick 服务器 我的项目是实时跟踪GPS 我想使用TCP连接与GPS跟踪设备进行通
  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • GpsStatusListener:尽管状态为 GpsStatus.GPS_EVENT_FIRST_FIX,但修复中未使用卫星

    我向我的位置管理器添加了一个 GPS 状态侦听器 以便查看何时获得第一个修复 当我收到 GPS EVENT FIRST FIX 时 我会循环遍历所有卫星 但为什么修复中没有使用它们 usedInFix 我的日志对所有卫星都显示 错误 fin
  • 定位精度定义 - iOS

    iOS 上返回的 准确性 或 不确定性 的统计意图是什么 即使是近似值 例如 Android 文档对其返回的精度数字进行了解释 从这个意义上讲 它大约是一个标准差 我们将准确度定义为 68 置信度的半径 换句话说 如果 您以该位置的纬度和经
  • Android 上下文不在活动中?还有其他无活动编程吗?

    我会非常努力地将其变成一个综合问题 我正在编写一个方法来获取一个包含 Android 设备城市名称的字符串 该名称由LocationManager and getLastKnownLocation 等等 然后我意识到我需要在另一个活动中再次
  • 如何在android中以编程方式启用位置访问?

    我正在开发与地图相关的 Android 应用程序 如果位置服务未启用显示对话框提示 我需要在客户端开发中检查位置访问是否启用 如何在android中以编程方式启用 位置访问 使用下面的代码进行检查 如果禁用 将生成对话框 public vo
  • 当我们在Android中通过GPS获取位置时,如何获取卫星名称或号码?

    我是android新手 我通过gps获取位置 我还在我们的代码中获取卫星号码 但我想获取用于获取位置的特定卫星名称或号码 我有很多谷歌 但没有得到适当的解决方案 我的问题是 1 It is possible to get a particu
  • 如何检测用户是否禁用 GPS(Android - Play 服务)

    我使用 gms location LocationListener Google Play 服务 来获取用户的位置 它工作正常 但我想检测用户何时禁用或启用他 她的 GPS 就像这张照片一样 当我打开 关闭位置时 不会调用任何方法 当我切换

随机推荐

  • 基于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