电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
[GPS]如何用GPS模块实现精准授时和定位
分 享
扫描二维码分享
[GPS]如何用GPS模块实现精准授时和定位
GPS
STM32
IAMLIUBO
关注
发布时间: 2020-03-09
丨
阅读: 3870
## 我是谁,谁又是我 Hi, 大家好,我是刘波,人在江湖行走的ID是:[IAMLIUBO](https://blogs.oopswow.com)!受到电子芯吧客平台用户活跃度的感召,为了防止世界被破坏,为了保护世界的和平,于是我决定也要来电子芯吧客平台混个脸熟了(我不会承认我是为了稿费才来的!绝对不会!滑稽.gif)。 ## 前言 这两天在调试一款GPS模块,感觉还挺好玩,虽然定位不是很准确,但是时间同步倒是还可以,这里简单记录一下分享给大家!(无图无真相?先上图!) ![](https://cf01.ickimg.com/bbsimages/202003/81a1e0f4645c8e6bb62117752f7d8d74.png) ![](https://cf01.ickimg.com/bbsimages/202003/40d576947d34d8805f0eebcf53c23fec.png) 第一张图片是做了一个小Demo,不过还没完全做完,第二张图片是解析GPS的数据,然后通过串口打印。 ## 准备 **硬件:** * [STM32F103RCT6](https://buy.icxbk.com/index.php?ctl=Product&met=detail&item_id=3620 "STM32F103RCT6")(你也可以选用其它单片机) * NEO-7N(GPS,我使用的这一款,你也可以选择其它的) **软件:** * Keil * CubeMX ## 开始 在开始之前我们先来了解一下GPS相关一些基础知识,首先GPS是什么? > 全球定位系统(Global Positioning System,GPS)是一种以空中卫星为基础的高精度无线电导航的定位系统,它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间信息。GPS自问世以来,就以其高精度、全天候、全球覆盖、方便灵活吸引了众多用户。GPS不仅是汽车的守护神,同时也是物流行业管理的智多星。随着物流业的快速发展,GPS有着举足轻重的作用,成为继汽车市场后的第二大主要消费群体。GPS是美国从20世纪70年代开始研制,历时20年,耗资200亿美元,于1994年全面建成,具有在海、陆、空进行全方位实时三维导航与定位功能的新一代卫星导航与定位系统。*-引用自百度百科* 这是GPS这个名词的百度百科解释,不过相信大家也都很熟悉了,因为我们使用的手机就有GPS定位芯片。我们平常开车用到的导航,都是利用定位芯片来对你在真实物理空间中的坐标定位,这里为什么表述为定位芯片呢?因为现在不单单有GPS,像我们国家的北斗全球定位系统,欧盟的伽利略,俄罗斯的格洛纳斯等等,都是可以进行定位的,只不过因为美国的GPS最先问世和商用,我们也就习惯的了叫GPS,其实叫GNSS也许更合适点,大家觉得呢?。 第二个问题,坐标是什么? 相信大家小学二年级都学过地理了,这里我就不再赘述了,就简单给大家介绍一下,我们常说的坐标其实是两个值,也就是纬度和经度,纬度又人为的划分为了北纬和南纬,当然经度也划分为了东经和西经,大家有这些概念就可以了,毕竟小学生都学过的知识,我也不方便给大家讲太多了(认真而不失优雅脸.gif)。 第三个问题,什么是UTC时间? 这个讲起来就有点麻烦了,不过小学二年级的时候我们学过的地理告诉我们,我们采用的是东八区的时间,也就是我们的北京时间,不晓得大家还记得吗?北京时间就是在UTC时间的基础上增加8小时,那么为什么要增加8小时呢?因为地球是个球,而太阳只有一个,地球上每个地方在同一UTC时刻,光照是不一样的,所以大家就协调了一下,你加俩小时,我加八个小时啥的。 OK,小学生补课课堂结束,下面我们直接考试吧!首先我们先来了解一下这个GPS模块,NEO-7N其实支持的不仅仅是GPS定位系统,还支持其它的,比如: ![](https://cf01.ickimg.com/bbsimages/202003/a84cca272273e2189f9b13b8ba90ffd3.png) 如果英语看不懂没关系,看几个小标题就行,所以说,我们一直叫GPS定位,其实有点太先入为主了,不过比较可惜的是还不支持北斗定位,如果支持北斗定位的话估计精度会更高点。 好了,了解完这些,我们直接使用吧,因为这个模块使用是比较简单的,因为我们需要的信息会通过USB,串口定时自动输出(间隔1s),所以本质上来讲我们是不需要进行太多开发的,因为我们需要的信息会自己打印,我们只需要接收并解析就可以了。 ![](https://cf01.ickimg.com/bbsimages/202003/2378fc26112f238ca23c140bd585a7a3.png) 我们需要解析的就是RMC数据,也就是推荐定位数据,其中串口和USB输出的数据帧格式都是符合RTCM(Radio Technical Commission for Maritime services)标准协议的,所以你学会了这一款模块,别的也就都会了。 #### RMC数据格式: $GPRMC(推荐定位信息,Recommended Minimum Specific GPS/Transit Data) $GPRMC语句的基本格式如下: $GPRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF) * (1) UTC时间,hhmmss(时分秒) * (2) 定位状态,A=有效定位,V=无效定位 * (3) 纬度ddmm.mmmmm(度分) * (4) 纬度半球N(北半球)或S(南半球) * (5) 经度dddmm.mmmmm(度分) * (6) 经度半球E(东经)或W(西经) * (7) 地面速率(000.0~999.9节) * (8) 地面航向(000.0~359.9度,以真北方为参考基准) * (9) UTC日期,ddmmyy(日月年) * (10) 磁偏角(000.0~180.0度,前导位数不足则补0) * (11) 磁偏角方向,E(东)或W(西) * (12) 模式指示(A=自主定位,D=差分,E=估算,N=数据无效) 可以看到每个数据间都是用逗号进行分隔的,这也正式我们解析这个数据帧的关键地方,大家想到用什么函数了? ## 解析代码 这里我解析了一下UTC时间和经纬度,大家如果需要别的数据,也可以按照我的解析方式去做,使用的是STM32的串口2跟模块的串口进行的连接,然后DMA+串口空闲中断接收,这里给大家简单贴一下解析代码,因为芯吧客没法上传附件,所以完整代码可以在我的Github上获取,喜欢的还请点个star~ ```C void Parse_GPS_Data(void) { char *subString; char *subStringNext; uint8_t i = 0; if (GPS_Data.isGetData) { GPS_Data.isGetData = 0; // printf("%s",GPS_Data.GPS_Data_Buffer); for (i = 0 ; i <= 9 ; i++) { if (i == 0) { if((subString = strstr((char *)GPS_Data.GPS_Data_Buffer, ",")) == NULL) printf("GPS data parse error(1)\r\n");; } else { subString++; if ((subStringNext = strstr(subString, ",")) != NULL) { char isRightBuffer[2]; switch(i) { case 1: memcpy(GPS_Data.UTCTime, subString, subStringNext - subString); GPS_Data.UTCTime[10] = '\0'; break; case 2: memcpy(isRightBuffer, subString, subStringNext - subString); isRightBuffer[1] = '\0'; break; case 3: memcpy(GPS_Data.latitude, subString, subStringNext - subString); GPS_Data.latitude[10] = '\0'; break; case 4: memcpy(GPS_Data.N_S, subString, subStringNext - subString); GPS_Data.N_S[1] = '\0'; break; case 5: memcpy(GPS_Data.longitude, subString, subStringNext - subString); GPS_Data.longitude[11] = '\0'; break; case 6: memcpy(GPS_Data.E_W, subString, subStringNext - subString); GPS_Data.E_W[1] = '\0'; break; case 7: break; case 8: break; case 9: memcpy(GPS_Data.UTCDate, subString, subStringNext - subString); GPS_Data.UTCDate[6] = '\0'; break; default:break; } subString = subStringNext; GPS_Data.isParseData = 1; if(isRightBuffer[0] == 'A') GPS_Data.isRightData = 1; else if(isRightBuffer[0] == 'V') GPS_Data.isRightData = 0; } else { printf("GPS data parse error(2)\r\n"); } } } __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE); HAL_UART_Receive_DMA(&huart2,(uint8_t *)GPS_Data.GPS_Data_Buffer,GPS_BUFFER_SIZE); } } void Print_GPS_Data(void) { if (GPS_Data.isParseData) { GPS_Data.isParseData = 0; if(GPS_Data.isRightData) { GPS_Data.isRightData = 0; printf(" *****************************************\r\n"); printf(" ***** GPS LOCATION *****\r\n"); printf(" *** Date:%s TIME:%s ***\r\n", GPS_Data.UTCDate, GPS_Data.UTCTime); printf(" * *\r\n"); printf(" *** %s: %s %s: %s ***\r\n", GPS_Data.N_S,GPS_Data.latitude,GPS_Data.E_W,GPS_Data.longitude); printf(" ***** IAMLIUBO *****\r\n"); printf(" *****************************************\r\n\r\n"); } else { printf("GPS data not right\r\n"); } } } ``` OK,小学生课堂就到这里,需要说明的是代码不包含显示屏显示,以为小Demo还没有完全做完,做好后会把代码放出来的,这里只是把GPS这块单独摘了出来。 最后完整代码的Github地址:[IAMLIUBO STM32 HAL](https://github.com/imliubo/makingfunxyz-STM32-Study-HAL) 关于图一的小Demo预览视频可以在我的B站动态中查看,完成后也会第一时间在B站(@IAMLIUBO)或者电子芯吧客发布演示视频,请大家持续关注哦~
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
2
)
IAMLIUBO
擅长:工控电子 能源电源 光电显示 设计,制造及服务 智能硬件
关注
评论
(1)
登录后可评论,请
登录
或
注册
孟大仙来巡山
41
天前...
我是绝对不会承认,来电子芯吧客,就是看你表演的。
0
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交