解析GPS数据(长字符串解析示例)

这篇具有很好参考价值的文章主要介绍了解析GPS数据(长字符串解析示例)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


这里GPS一般返回的都是大量的数据,而且是一行行的那种,大部分数据也不太用的到,所以这个时候用串口DMA空闲中断其实就意义不大,这样我们就可以用一种新的思路来进行数据解析,专门针对这样的数据!!!

1、ATGM336H模块介绍

这里我用的大概长这样,还有很多其他版本的,不过区别不大,都差不多,可对照学习
解析GPS数据(长字符串解析示例)
参数说明:

参数 详情说明
波特率: 9600(默认),可用软件设置
可用卫星: GPS和北斗双模
输出协议: NMEA-0183
TXD/RXD电平: 串口TTL电平
超小尺寸: 15mm*13mm

这里官方还给出了输出经纬度转换的计算方法

解析GPS数据(长字符串解析示例)

2、驱动编写

在cubemx中配置如下,该模块是使用串口进行数据接受的,因此我们这里准备两个串口,其中接收数据的串口开启中断
解析GPS数据(长字符串解析示例)
之后我们根据官方数据格式编写数据结构体,同时在结构体中进行标志位等的设计
解析GPS数据(长字符串解析示例)
下面就是我们数据解析的重头戏了,不像以往空闲中断的方式,一次放入一大堆数据,这样比较吃内存,如果是数据比较规律就还好,但是如果数据里面有很多无效信息的时候,就没有必要浪费这个内存,这种采用接收中端来解析的方式就比较合适了,可以很好的处理数据,而且不会过度的占用内存,但是缺点也比较明显,就是设备会频繁的进入中断,这个是我们需要考量的因素,根据实际情况来选用!!!
解析GPS数据(长字符串解析示例)
经过上面的过程我们只是获取到了数据,并将数据放到结构体里面,但是还没有把数据把数据放到我们想要的变量里面,因此我们下面就要对这个有效数据进行进一步的处理,这里我们用到了strstr这个函数,函数的用法如下所示,就是查找函数,这里我们用来查找字符串里面的分隔符,函数的描述如下所示,根据这个方法,我们就可以很方便的获取我们需要的字符串子串。
解析GPS数据(长字符串解析示例)
下面是解析函数的使用说明,他的计算流程我已经在图中说清楚了
解析GPS数据(长字符串解析示例)
之后我们就可以解析并打印数据了,打印数据这里只是比较简单的printf函数,就不具体介绍了,详情可以查看源代码
解析GPS数据(长字符串解析示例)

这里特别注意

  • gps在室内一般是没有信号的,不要尝试在室内使用,最好是阳台,这样效果好点!
  • 第一次使用官方宣称是冷启动,耗时比较长,1-10分钟,所以不要急

3、源码

gps.c

/*
 * gps.c
 *
 *  Created on: Mar 25, 2022
 *      Author: LX
 */


#include "gps.h"
#include "string.h"
#include "stdio.h"

_SaveData Save_Data;

void errorLog(int num)
{
  while (1)
  {
    printf("ERROR%d\r\n", num);
  }
}
void clrStruct()
{
  Save_Data.isGetData = 0;
  Save_Data.isParseData = 0;
  Save_Data.isUsefull = 0;
  memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空
  memset(Save_Data.UTCTime, 0, UTCTime_Length);
  memset(Save_Data.latitude, 0, latitude_Length);
  memset(Save_Data.N_S, 0, N_S_Length);
  memset(Save_Data.longitude, 0, longitude_Length);
  memset(Save_Data.E_W, 0, E_W_Length);
}
//gps数据解析
void parseGpsBuffer()
{
    char *subString;
    char *subStringNext;
    char i = 0;
    if (Save_Data.isGetData)
    {
        Save_Data.isGetData = 0;
        printf("**************\r\n");
        printf(Save_Data.GPS_Buffer);

        for (i = 0; i <= 6; i++)
        {
            if (i == 0)
            {
                if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
                    errorLog(1); //解析错误
            }
            else
            {
                subString++;
                if ((subStringNext = strstr(subString, ",")) != NULL)
                {
                    char usefullBuffer[2];
                    switch (i)
                    {
                    case 1:
                        memcpy(Save_Data.UTCTime, subString, subStringNext - subString);
                        break; //获取UTC时间
                    case 2:
                        memcpy(usefullBuffer, subString, subStringNext - subString);
                        break; //获取UTC时间
                    case 3:
                        memcpy(Save_Data.latitude, subString, subStringNext - subString);
                        break; //获取纬度信息
                    case 4:
                        memcpy(Save_Data.N_S, subString, subStringNext - subString);
                        break; //获取N/S
                    case 5:
                        memcpy(Save_Data.longitude, subString, subStringNext - subString);
                        break; //获取经度信息
                    case 6:
                        memcpy(Save_Data.E_W, subString, subStringNext - subString);
                        break; //获取E/W

                    default:
                        break;
                    }
                    subString = subStringNext;
                    Save_Data.isParseData = 1;
                    if (usefullBuffer[0] == 'A')
                        Save_Data.isUsefull = 1;
                    else if (usefullBuffer[0] == 'V')
                        Save_Data.isUsefull = 0;
                }
                else
                {
                    errorLog(2); //解析错误
                }
            }
        }
    }
}
//gps数据打印
void printGpsBuffer()
{
    if (Save_Data.isParseData)
    {
        Save_Data.isParseData = 0;

        printf("Save_Data.UTCTime = ");
        printf(Save_Data.UTCTime);
        printf("\r\n");

        if (Save_Data.isUsefull)
        {
            Save_Data.isUsefull = 0;
            printf("Save_Data.latitude = ");
            printf(Save_Data.latitude);
            printf("\r\n");

            printf("Save_Data.N_S = ");
            printf(Save_Data.N_S);
            printf("\r\n");

            printf("Save_Data.longitude = ");
            printf(Save_Data.longitude);
            printf("\r\n");

            printf("Save_Data.E_W = ");
            printf(Save_Data.E_W);
            printf("\r\n");
        }
        else
        {
            printf("GPS DATA is not usefull!\r\n");
        }
    }
}

gps.h文章来源地址https://www.toymoban.com/news/detail-474627.html

/*
 * gps.h
 *
 *  Created on: Mar 25, 2022
 *      Author: LX
 */

#ifndef GPS_H_
#define GPS_H_

#include "main.h"

//定义数组长度
#define GPS_Buffer_Length 80
#define UTCTime_Length 11
#define latitude_Length 11
#define N_S_Length 2
#define longitude_Length 12
#define E_W_Length 2

typedef struct SaveData
{
	uint8_t GPS_Buffer[GPS_Buffer_Length];
	uint8_t isGetData;		//是否获取到GPS数据
	uint8_t isParseData;	//是否解析完成
	uint8_t UTCTime[UTCTime_Length];		//UTC时间
	uint8_t latitude[latitude_Length];		//纬度
	uint8_t N_S[N_S_Length];		//N/S
	uint8_t longitude[longitude_Length];		//经度
	uint8_t E_W[E_W_Length];		//E/W
	uint8_t isUsefull;		//定位信息是否有效
} _SaveData;

void clrStruct();
void parseGpsBuffer();
void printGpsBuffer();

#endif /* GPS_H_ */

到了这里,关于解析GPS数据(长字符串解析示例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MYSQL字符串函数详解和实战(字符串函数大全,内含示例)

    MySQL提供了许多字符串函数,用于处理和操作字符串数据。以下是一些常用的MYSQL字符串函数。 建议收藏以备后续用到查阅参考 。 目录 一、CONCAT 拼接字符串 二、CONCAT_WS 拼接字符串 三、SUBSTR 取子字符串 四、SUBSTRING 取子字符串 五、SUBSTRING_INDEX 取子字符串 六、REPLACE 替换子

    2024年02月05日
    浏览(39)
  • Java 解析多层嵌套json数据及json字符串与对象的相互转换

    本文主要介绍java解析多层嵌套json数据以及字符串与JSON对象之间的相互转换,包括:json字符串的取值,json对象与字符串的相互转换,字符串转化为java对象,字符串转化为javaList列表等。 提示:以下是本篇文章正文内容,下面案例可供参考 数据格式:JSON实际上就是键值对(

    2024年02月04日
    浏览(41)
  • C# tcp客户端字符串(图片名称)+ 图片数据打包,发送到服务端;服务端接收到数据后解析数据包

    在C#中,要将字符串和图片数据打包发送到服务端,并在服务端解析这些数据,可以按照以下步骤进行: 客户端打包数据 1、创建一个自定义的数据结构来保存字符串和图片数据。 2、将字符串转换为字节数组。 3、将图片数据转换为字节数组。 4、将字符串和图片数据的字节

    2024年01月20日
    浏览(33)
  • 如何将化学分子SMILES字符串转化为Pytorch图数据结构——ESOL分子水溶性数据集解析

    硬核原创,转载请注明出处: https://leytton.blog.csdn.net/article/details/130406553 在用Pytorch图神经网络对化学分子进行数据分析的时候,经常使用现有的数据集。看到自动处理完毕的数据结构,里面的特征值让我们一脸懵逼,不知道代表的是什么含义。本文将带大家分析这些数据结构

    2024年02月06日
    浏览(33)
  • redis 字符串类型常用场景以及相关示例

    可以先看一下系列第一篇文章 字符串可以用作缓存键值对的存储方式。通过将经常使用的数据存储为字符串,可以提高读取速度,并减少数据库等后端系统的负载 数据库查询结果的缓存 场景 频繁读取相同数据 当某个数据被频繁地读取,而且这些读取操作对应的数据库查询

    2024年02月16日
    浏览(25)
  • mysql 解析json字符串、数组字符串、json数组字符串

    笔者使用mysql 5.7进行了一次json字符串的解析,因为一直在搞大数据相关的数据库、olap等,太久没有用mysql5.x的版本,一些函数已经不知道支不支持,我的同事建议我使用like、rlike模糊匹配的方式,身为数据人我不太喜欢用这种手段,因为他们比较低效。于是我想这里总结一下

    2024年02月16日
    浏览(31)
  • 深入解析C语言中的字符串和字符串处理函数

    标题:详解C语言中的字符串和字符串处理函数 目录: 1.引言 2.什么是C语言中的字符串 3.字符串的表示方式 4.C语言中的字符串处理函数 5.例子:使用字符串处理函数的示例代码 6.总结 在C语言中,字符串是一种常见的数据类型,用于存储一串字符。本篇博客将详细介绍C语言中

    2024年02月15日
    浏览(31)
  • 使用Java Swing绘制字符串描边的示例代码

    我最近在工作的实际开发中,遇到了一个需求,给字符串描边,无从那个下手,最终请教了代码生成的AI工具,把这个需求实现了,在次记录供大家参考, 我解决问题之后,觉得还是把这些坑都写清楚,方便 大家少踩坑呢。 此代码有该AI 助手为您带来的,v信小程序:

    2024年02月16日
    浏览(23)
  • 字符串的全面解析

    目录 前言: 字符串的赋值   字符串的初始赋值两种:   输出的形式:   输入赋值四种方法:   在函数中的赋值(复制): 小问题: 字符串处理函数string: 多维字符串: 为什么非要在字符串后加\\\'\\0\\\'的问题。 子函数调用字符串: 字符串的错误使用方法: 通过单个元素的比较

    2024年02月07日
    浏览(24)
  • 字符函数和字符串函数解析及模拟实现

    字符串以’\\0’作为结束标志,strlen函数返回的是在字符串中’\\0’前面出现过的字符个数(不包括’\\0’)。 参数指向的字符串必须以’\\0’结束。 注意函数的返回值位size_t, 是无符号的 。 Copies the C string pointed by source into the array pointed by destination, including the terminating null c

    2024年02月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包