GPS的NMEA数据格式解析及GPS/北斗双模模块TD3020C介绍

date
May 22, 2020
slug
2020-05-22-GPS-NMEA-td3030c
status
Published
tags
GPS
summary
本文总结了GPS标准的NMEA数据格式的协议解析,以及一个GPS模块TD3020C的介绍。
type
Post

NMEA数据格式

NEMA-0183是GPS接收机应该遵守的标准协议,也是当前世界上GPS接收机上使用最广泛的协议,绝大多数的GPS接收机,包括北斗模块在内都遵守或者至少兼容这个协议。
NMEA语句的标准格式定义如下:
  • $<语句类型标识>,<数据字段>,<数据字段>,......,<数据字段>*<校验和>[CR][LF]
  • 语句类型标识由两部分组成:语句标识符+语句格式符;
    • 北斗和GPS使用不同的语句标识符符,北斗的语句标识符是BD,GPS的则是GP;
    • 后面的语句格式符是通用的,例如都使用GGA表示位置信息,VTG表示地面速度信息。
  • 每种不同的NEMA语句包含有多个独立的定义不同的数据字段,各个数据字段使用逗号分割开;
  • <校验和>的计算是从$到*之间的所有字符;
  • CR和LF则是标准的回车换行符。
在应用中,无论是使用标准的GPS模块还是国内的北斗模块,模块本身输出的定位等信息的格式和协议基本上都是遵循NEMA-0183标准(只是语句的标识符稍有差异):
notion image
而在硬件方面,基本上大部分GPS和北斗模块以及双模模块都采用标准的串口输出这些NEMA语句,因此无论在硬件层面还是软件层面,都可以很方便做到兼容和替换。

常用的NMEA-0183语句

NMEA-0183协议定义的语句非常多,但是常用的兼容性最广的语句主要有:
  • $GPGGA:定位信息
  • $GPGSA:当前卫星信息
  • $GPGSV:可见卫星信息
  • $GPRMC:推荐定位信息数据格式
  • $GPVTG:地面速度信息
  • $GPGLL:地理定位信息
对于我们在应用中使用GPS或者北斗模块而言,主要使用到其提供的以下功能:
  • 定位的经纬度信息;
  • 速度及运动方向信息;
  • 海拔高度;
  • 校时;
因此对于我们的应用而言,只需要关注和解析定位模块输出的以下语句即可:
  • GGA:经纬度,GPS状态,可用卫星数量,海拔高度;
  • RMC:经纬度,UTC时间(精确到ms),磁偏角;
  • VTG:速度及其方向;
以下链接是一个NEMA数据的解析库,可以在应用中尝试直接使用这个库来实现对所需要信息的解析处理,避免重复造轮子:
  • http://nmea.sourceforge.net/#downloads

GPRMC/BDRMC

RMC数据帧的结构及其各个字段的定义如下:
  • $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh[CR][LF]
  • <1> UTC时间,hhmmss(时分秒)格式
  • <2> 定位状态,A=有效定位,V=无效定位
  • <3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
  • <4> 纬度半球N(北半球)或S(南半球)
  • <5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
  • <6> 经度半球E(东经)或W(西经)
  • <7> 地面速率(000.0~999.9节,前面的0也将被传输)
  • <8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
  • <9> UTC日期,ddmmyy(日月年)格式
  • <10> 磁偏角(000.0~180.0度,前面的0也将被传输)
  • <11> 磁偏角方向,E(东)或W(西)
  • <12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
  • *: 语句结束标志符
  • hh:从$开始到*之间的所有ASCII码的异或校验
  • [CR] 回车符,结束标记
  • [LF] 换行符,结束标记
RMC语句中包含的重要信息有:UTC时间,经纬度,定位状态,速度(以节为单位,需要自行换算为km/h)及其方向,磁偏角等;
  • 可以看到,RMC语句中基本上包含了我们所关注的绝大多数常用信息;
  • 如果需要获取以km/h为单位的速度信息,可以解析GPVTG语句,该语句中同时包含有以节为单位和以km/h为单位的速度信息;

GPGGA/BDGGA

GGA数据帧的结构及其各个字段的定义如下:
  • $GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx<CR><LF>
  • $GPGGA:起始引导符及语句格式说明,如果是北斗模块的话就是BDGGA;
  • <1> UTC时间,格式为hhmmss.sss;
  • <2> 纬度,格式为ddmm.mmmm(第一位是零也将传送);
  • <3> 纬度半球,N或S(北纬或南纬)
  • <4> 经度,格式为dddmm.mmmm(第一位零也将传送);
  • <5> 经度半球,E或W(东经或西经)
  • <6> GPS状态, 0初始化, 1单点定位, 2码差分, 3无效PPS, 4固定解, 5浮点解, 6正在估算 7,人工输入固定值, 8模拟模式, 9WAAS差分
  • <7> 使用卫星数量,从00到12(第一个零也将传送)
  • <8> HDOP-水平精度因子,0.5到99.9,一般认为HDOP越小,质量越好。
  • <9> 海拔高度,-9999.9到9999.9米
  • M 指海拔单位为米
  • <10> 大地水准面高度异常差值,-9999.9到9999.9米
  • M 指单位米
  • <11> 差分GPS数据期限(RTCM SC-104),最后设立RTCM传送的秒数量,如不是差分定位则为空
  • <12> 差分参考基站标号,从0000到1023(首位0也将传送)。
  • *:语句结束标志符
  • xx 从$开始到*之间的所有ASCII码的异或校验
  • [CR] 回车符,结束标记
  • [LF] 换行符,结束标记
GGA语句中比较重要的信息就是:经纬度,GPS状态,当前使用的卫星数量,海拔高度;

定位模块NMEA数据解析的小结

  • 从以上整理的数据可以看出来,GPGGA和GPRMC均包含有经纬度等定位信息,那我们在应用中应该用哪一个呢?其实,GPGGA是GPS定位信息,而GPRMC是推荐定位信息,所以用GPRMC会比较准确。
  • 考虑到我们普通应用中需要从定位模块中获取的信息类型,基本上我们要用到的大部分信息在GPRMC语句中都已经包含了,所以只需要对GPRMC语句进行解析就可以了。

GPS/北斗双模模块TD3020C的使用介绍

TD3020C是东莞市泰斗微电子推出的一款GPS和北斗二代双模导航定位模块,模块尺寸22.4mm x 17mm x 2.0mm,采样28pin邮票孔封装,与主流的GPS模块(例如UBlox的LEA-5/6系列)在硬件上做到pin to pin兼容。
notion image
典型应用的走线图如下所示:
notion image
主要包含的接口如下:
  • 电源接口;
  • 天线接口:GPS和北斗共用同一个外置有源天线接口;
  • 休眠模式控制接口
    • 模块通过外部休眠模式引脚控制进入休眠状态,功耗可降至5mA以下;
  • 两组UART接口
    • 串口1(TXD1/RXD1),在UTC秒边界输出NMEA数据,也可以通过这个串口控制模块的工作模式、输出波特率等;该串口默认波特率为9600;
    • 串口2(TXD2/RXD2),备用串口,用于输出自定义格式的数据,也可以用于对模块进行软件升级。
  • GPIO接口
    • 包含3个GPIO接口,可以根据用户需求定义这些GPIO接口的功能。
TD3020C在正常工作中除了能够按照NEMA标准输出经纬度等信息以外,还可以通过UART1来控制模块的定位模式、波特率等运行参数。
  • 定位模式的切换指令:可以支持GPS和北斗的独立工作模式和混合工作模式;
notion image
  • 波特率设置指令:设置串口输出的波特率;
notion image
  • GPS/北斗模块NMEA信息输出更新率设置指令:
notion image

© Pavel Han 2020 - 2022