NMEA - 0183 是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式。目前业已成了 GPS/北斗导航设备统一的 RTCM(Radio Technical Commission for Maritime services)标准协议。
NMEA-0183 协议采用 ASCII 码来传递 GPS 定位信息,我们称之为帧。
帧格式形如:$aaccc,ddd,ddd,…,ddd*hh(CR)(LF)
1、“$”:帧命令起始位
2、aaccc:地址域,前两位为识别符(aa),后三位为语句名(ccc)
3、ddd…ddd:数据
4、“*”:校验和前缀(也可以作为语句数据结束的标志)
5、hh:校验和(check sum),$与*之间所有字符 ASCII 码的校验和(各字节做异或运算,得到校验和后,再转换 16 进制格式的 ASCII 字符)
6、(CR)(LF):帧结束,回车和换行符
NMEA-0183 常用命令如表所示:
序号 |
命令 |
说明 |
最大帧长 |
1 |
$GNGGA |
GPS/北斗定位信息 |
72 |
2 |
$GNGSA |
当前卫星信息 |
65 |
3 |
$GPGSV |
可见 GPS 卫星信息 |
210 |
4 |
$BDGSV |
可见北斗卫星信息 |
210 |
5 |
$GNRMC |
推荐定位信息 |
70 |
6 |
$GNVTG |
地面速度信息 |
34 |
7 |
$GNGLL |
大地坐标信息 |
-- |
8 |
$GNZDA |
当前时间(UTC1)信息 |
-- |
上表为 NMEA-0183 常用命令表
注 1: 即协调世界时,相当于本初子午线(0 度经线)上的时间,北京时间比 UTC 早 8 个小时。
接下来我们分别介绍这些命令。
一,$GNGGA(GPS 定位信息,Global Positioning System Fix Data)
$GNGGA 语句的基本格式如下(其中 M 指单位 M,hh 指校验和,CR 和 LF 代表回车换行,下同):
$GNGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF)
$GNGGA,095528.000,2318.1133,N,11319.7210,E,1,06,3.7,55.1,M,-5.4,M,,0000*69
二,$GNGSA(当前卫星信息)
$GNGSA 语句的基本格式如下:
$GNGSA,(1),(2),(3),(4),(5),(6)*hh(CR)(LF)
$GNGSA,A,3,14,22,24,12,,,,,,,,,4.2,3.7,2.1*2D
$GNGSA,A,3,209,214,,,,,,,,,,,4.2,3.7,2.1*21
注 1: 精度因子值越小,则准确度越高。
三,$GPGSV(可见卫星数,GPS Satellites in View)
$GPGSV 语句的基本格式如下:
$GPGSV, (1),(2),(3),...,(4),(5),(6),(7)*hh(CR)(LF)
注:每条 GSV 语句最多包括四颗卫星的信息,其他卫星的信息将在下一条$GPGSV 语句中输出。
$GPGSV,3,1,11,18,73,129,19,10,71,335,40,22,63,323,41,25,49,127,06*78
$GPGSV,3,2,11,14,41,325,46,12,36,072,34,31,32,238,22,21,23,194,08*76
$GPGSV,3,3,11,24,21,039,40,20,08,139,07,15,08,086,03*45
四,$BDGSV(可见卫星数,GPS Satellites in View)
$BDGSV 语句的基本格式如下:
$BDGSV, (1),(2),(3),(4),(5),(6),(7),...,(4),(5),(6),(7)*hh(CR)(LF)
注:每条 GSV 语句最多包括四颗卫星的信息,其他卫星的信息将在下一条$BDGSV 语句中输出。
$BDGSV,1,1,02,209,64,354,40,214,05,318,40*69
五,$GNRMC(推荐定位信息,Recommended Minimum Specific GPS/Transit Data)
$GNRMC 语句的基本格式如下:
$GNRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF)
$GNRMC,095554.000,A,2318.1327,N,11319.7252,E,000.0,005.7,081215,,,A*73
六,$GNVTG(地面速度信息,Track Made Good and Ground Speed)
$GNVTG 语句的基本格式如下:
$GNVTG,(1),T,(2),M,(3),N,(4),K,(5)*hh(CR)(LF)
$GNVTG,005.7,T,,M,000.0,N,000.0,K,A*11
七,$GNGLL(定位地理信息,Geographic Position)
$GNGLL 语句的基本格式如下:
$GNGLL,(1),(2),(3),(4),(5),(6),(7)*hh(CR)(LF)
八,$GNZDA(当前时间信息)
$GNZDA 语句的基本格式如下:
$GNZDA,(1),(2),(3),(4), (5), (6)*hh(CR)(LF)
$GNZDA,095555.000,08,12,2015,00,00*4C
NMEA-0183 协议命令帧部分就介绍到这里,接下来我们看看NMEA-0183 协议的校验,
通过前面的介绍,我们知道每一帧最后都有一个 hh 的校验和,该校验和是通过计算$与*之间所有字符 ASCII 码的异或运算得到,将得到的结果以 ASCII 字符表示就是该校验(hh)。例如语句:$GNZDA,095555.000,08,12,2015,00,00*4C,校验和(红色部分参与计算)计算方法为:
0X47 xor 0X4E xor 0X5A xor 0X44 xor 0X41 xor 0X2C xor 0X30 xor 0X39 xor 0X35 xor 0X35 xor 0X35 xor 0X35 xor 0X2E xor 0X30 xor 0X30 xor 0X30 xor 0X2C xor 0X30 xor 0X38 xor 0X2C xor 0X31 xor 0X32 xor 0X2C xor 0X32 xor 0X30 xor 0X31 xor 0X35 xor 0X2C xor 0X30 xor 0X30 xor 0X2C xor 0X30 xor 0X30
得到的结果就是 0X4C,用 ASCII 表示就是 4C。
NMEA-0183 协议我们就介绍到这里,了解了该协议,我们就可以编写单片机代码,解析 NMEA-0183 数据,从而得到 GPS/北斗定位的各种信息了。