玩转X-CTR100 l STM32F4 l U-Blox NEO-6M GPS卫星定位-nmealib解码库移植解码

我造轮子,你造车,创客一起造起来!塔克创新资讯【塔克社区 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/ 】

本文介绍X-CTR100控制器 扩展GPS卫星定位模块,型号为GY-GPS6MV2,使用U-BLOX NEO-6M模块,一款应用广泛的模块,淘宝上可以方便买到。
本文使用Tim开源解码库nmealib进行解码,串口输出解码结果。
原理
GPS定位原理
略
模块介绍
U-BLOX NEO-6M GPS 模块,具有高灵敏度、低功耗、小型化、其极高追踪灵敏度大大扩大了其定位的 覆盖面, 在普通GPS 接收模块不能定位的地方, 如狭窄都市天 空下 、 密集的丛林环境, NEO-6M 都能高精度定位。模块的高灵敏度、小静态 漂移、 低 功耗及轻巧的体积,适用于车 载 、手 持设备如 PDA,车辆监控、手 机、摄像 机 及其他移动定位系统的应用,是 GPS 产品应用的最佳选 择。该模块特点包括:
1, 模块采用U-BLOX NEO-6M模组,体积小巧,性能优异。
2, 模块自带陶瓷天线及MAXIM公司20.5dB高增益LNA芯片,搜星能力强。
3, 模块可通过串口进行各种参数设置,并可保存在EEPROM,使用方便。
4, 模块自带IPX接口,可以连接各种有源天线,适应能力强。
5, 模块兼容3.3V/5V电平,方便连接各种单片机系统。
6, 模块自带可充电后备电池,可以掉电保持星历数据1。

默认波特率9600。
NMEA-0183协议
NEO-6M模块通过串口输出GPS定位数据信息,这些信息默认采用NMEA-0183协议,几乎所有GPS模块都采用该协议,所以该软件也适应其它GPS模块。
NMEA是美国国家海洋电子协会(National Marine Electronics Association )为海用电子设备制定的标准格式,目前已经成为了GPS导航设备统一的RTCM标准协议,NMEA3.0协议还扩展了北斗导航系统的版本。
NMEA-0183是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的ASCII格式,使用逗号隔开数据,数据流长度从30-100字符不等,通常以每秒间隔选择输出,最常用的格式为"GGA",它包含了定位时间,纬度,经度,高度,定位所用的卫星数,DOP值,差分状态和校正时段等,其他的有速度,跟踪,日期等。NMEA实际上已成为所有的GPS接收机和最通用的数据输出格式。
NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL、$GPZDA等。下面给出这些常用NMEA-0183语句的字段定义解释。

示例:
|
nmealib-0.5.3解码库
nmealib是一个基于C语言的用于nmea协议的开源库。虽然nmea体积小巧,但是却具备了不少功能。
分析NMEA语句并把结果保存在合适的C语言结构体中。
除了解析NMEA语句之外,还可以产生NMEA语句。
支持多种NMEA语句,包括GPGGA, GPGSA, GPGSV, GPRMC, GPVTG。
解析算法层次严谨。
附加地理学相关功能,可支持导航等数据工作。
nmealib的目录还是非常清晰的,下面简单介绍一下。
include\nmealib文件夹中存在nmealib相关的头文件
src文件夹存放nmealib相关源文件,该文件夹中的内容和include\nmealib文件夹相对应
samples文件夹存放若干例子,一些简单易懂的例子。

利用nmealib解析GPS模块的输出结果大致可以分为三步,第一步定义和初始化GPS信息结构体和解析载体结构体,第二步调用nmea_parse函数完成解析工作,第三步释放解析载体所占用的内存空间。如果仔细查看nmea_parser_init部分的代码,便会发现函数中使用了C标准库的malloc函数,该函数会在RAM中的heap空间开辟一个空间,这就需要使用完该载体之后立刻释放,所以nmea_parser_init和nmea_parser_destroy需要成对出现。
nmeaINFO是一个很关键的结构体,该结构体中保存了nmea语句解析的结果。在调用了nmea_parse函数之后,直接查询nmeaINFO结构的数据即可得到解码的结果。
例如lat代表纬度,lon代表精度,speed代表速度。需要注意的是lat和lon的数值格式和百度地图的格式是有区别的,而速度的单位为KM/H,相对于"节"这个单位,公里每小时要好理解的多。

特别说明,NMEA解码库在进行解码时需要动态分配较大的堆空间。
例程
通过开源nmealib库解码GPS NMEA-0813协议,并通过USB串口输出解码结果。
硬件说明
硬件资源:
- 串口UART1
- LB接口(UART3接口)
- U-BLOX NEO-6M GPS模块(需自备)
硬件连接:
连接GPS模块到 LB接口(UART3接口),使用5V供电。GPS模块TX连接RX接口,GPS模块RX连接TX接口,如下图。

软件生态
X-SOFT软件生态,X-API文件如下。
ax_gps.c——X-CTR100 扩展GPS模块源文件
ax_gps.h——X-CTR100 扩展GPS模块头文件
操作函数如下:
|
void AX_GPS_Init(void); //GPS初始化 uint8_t AX_GPS_GetInfo(nmeaINFO *info); //GPS获取GPS信息 |
本软件参考秉火 GPS例程,采用DMA串口缓冲区方案,设置两个缓冲器,哪个缓冲器满后,解析数据,另一个缓冲器接收数据。防止数据丢失。
软件说明
主程序代码如下。
|
int main(void) { /* X-CTR100初始化 */ AX_Init(115200); printf("***X-CTR100 GPS例程***\r\n\r\n");
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//模块初始化及配置 AX_GPS_Init();
//初始化GPS数据结构 nmea_zero_INFO(&info);
while (1) { //接GPS信号更新 if (AX_GPS_GetInfo(&info)) { printf("**********X-CTR100 GPS解码信息**********************\r\n"); printf("*UTC时间:%d年%d月%d日 %d时%d分%d秒 \r\n", info.utc.year, info.utc.mon, info.utc.day, info.utc.hour, info.utc.min, info.utc.sec); printf("*纬度:%f 经度%f \r\n", info.lat, info.lon); printf("*正在使用的卫星:%d 可见卫星:%d \r\n", info.satinfo.inuse, info.satinfo.inview); printf("*海拔高度:%f 米 \r\n", info.elv); printf("*速度:%f km/h \r\n", info.speed); printf("*航向:%f 度 \r\n", info.direction); printf("****************************************************\r\n\r\n"); } } } |
特别说明,工程模板默认的堆栈分配不能满足解码库需求,NMEA解码库在进行解码时需要动态分配较大的堆空间,会出现解码错误。
需要在STM32的启动文件startup_stm32f10x_hd.s文件中对堆空间进行修改。

实现效果
测试时,需要将GPS天线放置到无遮挡空旷位置或窗户位置,以便接收GPS信号。首次启动时间较长,根据信号情况等待30~60S,如果长时间不能输出位置信息,请尝试更换位置。
输出结果如下所示。

参考
秉火《WF-NEO-6M用户手册——秉火GPS定位模块》
玩转X-CTR100 l STM32F4 l U-Blox NEO-6M GPS卫星定位-nmealib解码库移植解码的更多相关文章
- 玩转X-CTR100 l STM32F4 l ADC 模拟数字转换
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 AD转换接 ...
- 玩转X-CTR100 l STM32F4 l MPU6050加速度陀螺仪传感器
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 板载加速度 ...
- 玩转X-CTR100 l STM32F4 l X-CTR100与树莓派搭建机器人平台
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器与树莓派Linux系统 ...
- 玩转X-CTR100 l STM32F4 l 舵机控制
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器的舵机控制,X-CTR ...
- 玩转X-CTR100 l STM32F4 l DRV8825 A4988 步进电机控制
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器控制步进电机 ...
- 玩转X-CTR100 l STM32F4 l 基础例程printf、LED、蜂鸣器、拨码开关、位带操作
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器基础板载资源 ...
- 玩转X-CTR100 l STM32F4 l PS2无线手柄
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] SONY的PS2无线手柄是索尼游戏机的遥控手柄,控制 ...
- 玩转X-CTR100 l STM32F4 l DSP指令集性能测试
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 DSP库的 ...
- 玩转X-CTR100 l STM32F4 l FPU单精度浮点性能测试
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器如何开启ST ...
随机推荐
- winform中splitter的用法
1.将winform分为三列 整个窗体分成可以自动调节的三列的做法:1.往窗体上丢两个panel控件其中:panelLeft——设置Dock属性为“left”,并调节好其宽度panelRight——设 ...
- Pyinstaller 中 pandas出错问题的解决(详细)
环境配置 pip install pyinstaller pyinstaller中的参数 -F 表示生成单个可执行文件 -c 显示命令行窗口,一般一开始的时候使用,如果没有错误,那就使用-w命令 -w ...
- 机器学习-数据可视化神器matplotlib学习之路(四)
今天画一下3D图像,首先的另外引用一个包 from mpl_toolkits.mplot3d import Axes3D,接下来画一个球体,首先来看看球体的参数方程吧 (0≤θ≤2π,0≤φ≤π) 然 ...
- Quartz.NET简介及入门指南
Quartz.NET简介 Quartz.NET是一个功能完备的开源调度系统,从最小的应用到大规模的企业系统皆可适用. Quartz.NET是一个纯净的用C#语言编写的.NET类库,是对非常流行的JAV ...
- 字典重复key的合并
from collections import defaultdict d=defaultdict(set) s=[("001","A"),("001 ...
- 如何上传本地文件到github又如何删除自己的github仓库
首先自己在https://github.com/网站要注册一个账户 自己上传工程到jithub,没有付费的用户只能选用public,意味着你的项目在全网是可以被看到和下载的: 所以涉及私密信息的,需要 ...
- Android提高第九篇之GridView和SQLite实现分页表格
实现并封装一个SQL分页表格控件,不仅支持分页还是以表格的形式展示数据.先来看看本文程序运行的动画: 这个SQL分页表格控件主要分为“表格区”和“分页栏”这两部分,这两部分都是基于GridView实现 ...
- 精伦盒子H1,插上USB,找不到对应的文件路径
看USB的灯闪的挺正常的, 但就是不知道,该怎么mount 上去. 查了UDEV的资料, 发觉这个盒子虽然没有 udevmonitor命令, 却可以用 udevadm monitor 来监视udev ...
- 20170711筛选OutLook主题并转发
Sub 筛选OutLook主题并转发() On Error Resume Next Dim OutApp As Application Set OutApp = Application Dim Out ...
- 20170517xlVBA添加数据透视表
Sub AddPovitTable() 'Constance Const DATA_SHEET As String = "Advanced Filter" Const DATA_A ...