利用GPS定位在生活中并不少见,下面就记录一下自己使用GPS获取地理位置的过程。

目录

  • 实验前准备
  • NEO-7N GPS模块简介
  • USB转TTL调试模块
  • STM32获取GPS数据
  • GPS数据解析

实验前准备

  • STM32F429开发板
  • USB转TTL模块
  • NEO-7N GPS模块
  • 串口调试助手

NEO-7N简介

NEO-7N GPS 模块,具有高灵敏度、低功耗、小型化、极高追踪灵敏度等特点,大大扩大了其定位的覆盖面,在普通GPS 接收模块不能定位的地方,如狭窄都市天 空下 、 密集的丛林环境, NEO-7N 都能高精度定位。模块的高灵敏度、小静态漂移、 低功耗及轻巧的体积,适用于车 载 、手持设备如 PDA,车辆监控、手 机、摄像机及其他移动定位系统的应用。

USB转TTL调试模块

从上图可以看到,GPS模块是通过串口传输数据的,因此可以直接接USB转TTL模块调试,接线如下:
GPS---->USB-TTL
VCC ----> VCC
GND----> GND
TXD ----> RXD
RXD----> TXD

这里还要注意的是:GPS的波特率要选取9600

GPS模块稍微需要点时间工作,通常10分钟内获取到原始数据,还要注意的是:要把该模块放置在室外,不然接收不到GPS信号,建议外接天线,3米那种。 上图就是获取到的原始GPS数据,我们只需要关注以$GPRMC开头的这一组数据。

STM32获取GPS数据

既然GPS的数据输出是通过串口实现的,那么就可以通过配置STM32的串口来读取GPS数据。但是串口获得的原始数据这么多,要怎么才能得到我们想要的数据呢?上文所提到的关注的那一组数据,就是我们需要的数据。我们可以从串口开始数据解析,当串口识别到$GPRMC标识符的几个标识符号就能认为这是我们需要的数据,把该数据保存下来数组才能做后面的进一步处理。这里我使用了32上的串口3函数实现如下:

void USART3_IRQHandler(void)
{u8 Res;          if(__HAL_UART_GET_FLAG(&UART3_Handler,UART_FLAG_RXNE)!=RESET)//接收到数据{     HAL_UART_Receive(&UART3_Handler,&Res,1,1000);//读取到接收数据if(Res=='$')//读取到的值为'$'{point1=0;//指定位置为第0个字节}USART3_RX_BUF[point1++]=Res;if(USART3_RX_BUF[0] == '$' && USART3_RX_BUF[4] == 'M' && USART3_RX_BUF[5] == 'C')            //确定是否收到"GPRMC/GNRMC"这一帧数据{if(Res == '\n')                                       {memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空memcpy(Save_Data.GPS_Buffer, USART3_RX_BUF, point1);   //保存数据Save_Data.isGetData = true;point1 = 0;memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN);      //清空              }   }if(point1 >= USART3_MAX_RECV_LEN){point1 = USART3_MAX_RECV_LEN;}}
}

当保存了我们需要的数据后,就开始试着输出该组数据,观察$GPRMC这一组数据,都是通过“,”分隔符来区别下一个数据的,因此可以通过判断“,”的位置来确定数据。

void parseGpsBuffer()
{char *subString;char *subStringNext;char i = 0;if (Save_Data.isGetData){Save_Data.isGetData = false;printf("**************\r\n");printf("%s",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/Scase 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break;  //获取经度信息case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break;   //获取E/Wdefault:break;}subString = subStringNext;Save_Data.isParseData = true;if(usefullBuffer[0] == 'A')Save_Data.isUsefull = true;else if(usefullBuffer[0] == 'V')Save_Data.isUsefull = false;}else{errorLog(2);   //解析错误}}}}
}

为了让数据好看些,方便辨认,再通过一个函数让这些数据“排队输出”:

void printGpsBuffer()
{  if (Save_Data.isParseData){Save_Data.isParseData = false;printf("Save_Data.UTCTime = %s\r\n",Save_Data.UTCTime);if(Save_Data.isUsefull){          Save_Data.isUsefull = false;printf("Save_Data.latitude = %s\r\n",Save_Data.latitude);printf("Save_Data.N_S = %s\r\n",Save_Data.N_S);printf("Save_Data.longitude = %s\r\n",Save_Data.longitude);printf("Save_Data.E_W = %s\r\n",Save_Data.E_W);printf("the result longtitude is %s\r\n",longitudeToOnenetFormat(Save_Data.longitude));printf("the result latitude is %s\r\n",latitudeToOnenetFormat(Save_Data.latitude));//trans_result(Save_Data.longitude,Save_Data.latitude);}else{printf("GPS DATA is not usefull!\r\n");}}
}


上图长的一串数据就是提取的GPRMC数据,该行后面输出的就是分类后的数据。把获取到的经纬度值在地图输入,可以看到具体的位置了,还挺准确的,提供某宝资料附带的测试软件:wn6s

GPS数据解析

当然,上面输出的经纬度不是常见的GBS84地图值,因此还可以把数据再进行转换,得到我们想要的数据,这里不贴代码,提供一个思路:就是把GPRMC的值的整数部分和小数部分拆开,储存在数组里面再换算。

STM32F429+NEO -7N(GPS模块)输出地理位置信息相关推荐

  1. GPS模块输出的NMEA数据ddmm.mmmm转换成dd.ddddd,在google Earth Pro中描点

    GPS模块输出的数据是NMEA格式,其中GPGGA字段包含我们需要的经纬度信息. 例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,12.2 ...

  2. GPS模块输出数据的解释

    GPS输出的一些数据不知道什么意思,搜索了一下,跟大家分享,对新人来说还是很管用的详细解释数据如下: $GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2 ...

  3. Python学习:利用python解析GPS模块数据,并生成可视化地图显示

    一.GPS模块数据格式 笔者在项目中使用过移远L76K以及梦芯MXT905HM两款GPS定位芯片,两款芯片均是采用串口输出数据,而且数据包采用的是NEMA协议消息结构,消息结构如下: 数据包格式如下: ...

  4. 在树莓派上使用GPS模块

    GPSD介绍 GPSD是一个Linux下的一个守护进程,用以侦听来自GPS接收器的位置等信息,并将这些位置信息转换成一种简化的格式. GPSD支持二十多种不同GPS输出格式的GPS接收机,例如NMEA ...

  5. Geolocation模块管理设备位置信息,用于获取地理位置信息,如经度、纬度等。通过plus.geolocation可获取设备位置管理对象

    方法: getCurrentPosition: 获取当前设备位置信息 watchPosition: 监听设备位置变化信息 clearWatch: 关闭监听设备位置信息 对象: Position: JS ...

  6. 查看、修改图片gps地理位置信息

    文章目录 元数据 XMP ID3 Exif 如何在照片中查找地理位置等信息 引用: 参考链接1 参考链接2 了解GPS属于一种描述性元数据 元数据 元数据是指关于数据的数据.在这方面,数据是指您的数字 ...

  7. 使用带GPS模块的LTE Cat.4模组获取GPS定位信息

    上海域格miniPCIe LTE模组 CLM920 NC5 mdgv为Cat.4模组,且带有GPS模块可支持获取GPS定位信息: 将CLM920 NC5 MGC模组连接到PC上,安装驱动后,可以在设备 ...

  8. stm32+neo6m GPS模块定位系统

    开发平台:主处理器是意法半导体的stm32f103系列,这款芯片应用广泛,并且资料很多. 主要定位模块:ublox的一款芯片 开发环境:MDK5.0 主要代码还是参考原子的历程,在它的基础上实现了只提 ...

  9. 【智能无线小车系列十一】利用GPS 模块定位我的小车

    本章介绍一个额外的扩展模块:GPS定位模块,借助该模块我们可以实现小车的地理位置定位的功能. 使用从淘宝上淘得一个GPS模块,拿来测试一下: 下面直接贴一下关键的代码实现,仅供参考: get_gps_ ...

最新文章

  1. c++ 协程_理解Python协程(Coroutine)
  2. 神策数据斩获三殊荣,美通社小饭桌正和岛齐认可
  3. 转载:概率与梳理统计||数学基础
  4. 空军军医大学计算机复试线,2021空军军医大学考研国家线公布时间_国家线是多少分...
  5. Google 出售 Performics
  6. react-redux的todolist(b站笔记)-(四)
  7. linux考试试题及答案填空题,2017年LINUX认证考试模拟试题(附答案)
  8. C++ 信息管理系统
  9. 自己封装的swing框架,能够快速写出一个页面(带Tab、菜单)
  10. Mac 快捷键符号 斜箭头
  11. C# 使用NPIO在excel指定单元格写内容,合并单元格
  12. has no attribute _TensorLike
  13. 《帝国时代III黄金版》宣布
  14. 数据库系统概述之断言
  15. 电路——判断电压源和电流源是发出还是吸收功率
  16. 华为设备IGMP配置命令
  17. SQL Server 下取中位数(中位值)的方法
  18. flappy bird游戏源代码揭秘和下载后续---移植到html5网页浏览器
  19. 百度清风算法2.0——严厉打击欺骗下载 !
  20. Ubuntu18.04的IBUS输入法中Android Studio 无法输入中文

热门文章

  1. 孙振耀谈工作与生活---一篇说到我心坎上的文章
  2. 寒门学子的奋斗史(三) —— 走进大城市
  3. Ogre 材质与材质脚本
  4. 工具----8、Xray漏洞扫描器
  5. Sql注入的入门教程
  6. c语言大小写null,C语言NULL指针
  7. ElasticSearch——布尔查询
  8. eclipse中创建maven项目
  9. 数据结构算法——滑动窗口问题(以LeetCode滑动窗口题为例)
  10. 汽车配件公司业务系统设计报告