一、技术背景
全球导航卫星系统(GNSS, Global Navigation Satellite System)包括美国 GPS、俄罗斯 GLONASS、中国北斗(BDS)、欧盟伽利略(Galileo)等,为全球提供高精度定位、导航和授时服务。随着 GNSS 设备的普及,不同厂商的接收机、显示器、传感器等设备需要统一的通信协议以实现数据交互。
NMEA-0183 协议 由美国国家海洋电子协会(National Marine Electronics Association, NMEA)制定,最初用于解决航海电子设备间的兼容性问题。该协议定义了一套基于 ASCII 码的文本数据格式,支持异步串行通信,适用于低速数据传输场景(如串口、蓝牙)。通过标准化报文结构,GNSS 设备可统一输出位置、时间、速度、卫星状态等信息,极大降低了系统集成成本。
二、发展历史
1983 年:NMEA 发布首版《NMEA 0183 接口标准》(1.0 版),主要用于航海设备(如罗盘、测深仪)的数据交换,未直接支持 GNSS。
1992 年:随着 GPS 民用化,2.0 版协议引入针对 GPS 的专用语句(如$GPRMC、$GPGGA),定义了经纬度、时间、定位状态等核心字段。
1998 年:3.0 版优化校验机制,强制要求校验和字段,并支持更多卫星系统(如差分 GPS)。
2004 年 :3.1 版增加对 GLONASS 的支持,引入$GNGGA 等多系统兼容语句(GN为通用前缀)。
2019 年:4.1 版扩展支持北斗(BDS)、伽利略(Galileo),完善多星座混合定位数据格式,兼容现代 GNSS 接收机。
目前,NMEA-0183 仍是低成本 GNSS 设备的主流协议,尽管面临 NMEA-2000(高速网络协议)的竞争,但其简单性和跨平台兼容性使其在嵌入式系统、消费电子中持续广泛应用。
三、技术原理
1. 基本通信参数
物理层:异步串行通信(UART),常用波特率:4800、9600、19200 bps;数据位:8 位;停止位:1 位;无校验位(偶校验可选,取决于设备配置)。
数据格式:以文本行(ASCII 码)为单位,每行对应一条报文,以\r\n(CRLF)结尾,长度通常不超过 80 字节。
2. 报文结构
每条报文由以下部分组成(以 $GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62 为例):
[起始符] [语句标识] [数据字段] [校验和] [结束符]$ GPRMC 各字段 *62 \r\n
起始符:固定为$(或!,较少用)。
语句标识 :由 5 - 6 个字符组成,前两位为系统标识(如GP 代表 GPS,GN代表多系统通用),后 3 - 4 位为功能码(如 RMC 代表推荐最小定位信息)。
数据字段:以逗号分隔的具体数据,允许空字段(表示未提供该数据)。
校验和 :* 后接两位十六进制数,计算方式为 $ 到*之间所有字符的异或(XOR)结果。
结束符:固定为\r\n(十进制 ASCII 码 13 和 10)。
3. 常用语句解析
(1)核心定位语句
| 语句 | 名称 | 功能描述 |
|---|---|---|
$GPGGA |
全球定位系统固定数据 | 包含 UTC 时间、经纬度、定位状态、卫星数、精度因子、海拔高度等信息。 |
$GPRMC |
推荐最小定位信息 | 包含 UTC 时间、日期、经纬度、速度、航向、定位状态等核心导航数据。 |
$GPGSA |
卫星星历及 DOP 值 | 提供当前使用的卫星列表、定位模式(2D/3D)、PDOP/HDOP/VDOP 等精度因子。 |
$GPGSV |
可见卫星信息 | 分多条报文描述当前可见的所有卫星的 ID、仰角、方位角和信噪比(SNR)。 |
$GPVTG |
地面速度和航向 | 提供地面速度(knots/m/s)、真北 / 磁北航向角等信息。 |
(2)字段详解(以 $GPRMC 为例)
$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
081836:UTC 时间(小时: 分钟: 秒,08:18:36)。
A:定位状态(A= 有效,V= 无效)。
3751.65,S:纬度(37°51.65′ S,度分格式,需转换为十进制:37 + 51.65/60 = 37.86083° S)。
14507.36,E:经度(145°07.36′ E,转换为 145 + 7.36/60 = 145.12267° E)。
000.0:地面速度(节,0.0 节表示静止)。
360.0:航向角(度,相对于真北,360°即 0°)。
130998:日期(日 / 月 / 年,13 日 9 月 1998 年)。
011.3:磁偏角(度,E 表示东偏,需结合当地磁偏参数校正)。
(3)校验和计算
以 GPRMC 语句为例,计算 $ 到*之间的字符异或:
字符序列:GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E
异或运算:从第一个字符G(ASCII 71)开始,依次与下一个字符异或,最终结果为 0x62,对应校验和*62。
4. 多系统兼容性
现代设备支持多 GNSS 星座(如 GPS+ 北斗 +GLONASS),NMEA-0183 通过前缀区分:
GP:仅 GPS;GN:多系统通用(兼容所有支持的卫星系统);BD:北斗专用(如$BDGGA)。
通用语句(如$GNGGA)可包含多系统融合定位数据,字段定义与单系统语句一致。
四、应用场景
1. 航海导航
船舶定位 :通过$GPRMC 获取实时经纬度、航速、航向,结合电子海图(ECDIS)实现航线规划。
差分定位:接收$GPDTM(差分基站信息)提升定位精度,满足港口作业、远洋航行需求。
2. 陆地交通
车载导航:车载 GPS 模块通过 NMEA-0183 输出位置数据,供导航软件显示实时轨迹、计算路线。
物流追踪:物联网设备(如货车 GPS 终端)通过串口或蓝牙发送 NMEA 报文,后台解析后监控车辆位置与状态。
3. 航空与无人机
通用航空 :小型飞机使用 NMEA 设备获取位置、高度($GPGGA 中的海拔字段),辅助目视飞行规则(VFR)导航。
无人机控制:飞控系统接收 GNSS 报文,实现定点悬停、航路点飞行等自主控制功能。
4. 测绘与地理信息
高精度定位 :通过$GPGSA 的 DOP 值评估定位精度,结合 RTK(实时动态)技术(需扩展协议支持)实现厘米级测绘。
时间同步 :利用$GPRMC 的 UTC 时间字段,为分布式系统提供纳秒级授时(需设备支持高精度时标)。
5. 消费电子与物联网
运动手表:内置 GNSS 芯片通过 NMEA 协议输出跑步、骑行轨迹数据,同步至手机 APP。
资产追踪:低功耗设备(如集装箱追踪器)通过 NMEA 报文发送位置,经 GPRS/4G 上传至云端平台。
五、使用举例
1. 报文解析代码(Python)
defparse_nmea(line):ifnotline.startswith('$')or'*'notinline:returnNone# 提取校验和并计算data_part,checksum_part=line[1:].split('*',1)checksum_calculated=0forcindata_part:checksum_calculated^=ord(c)ifint(checksum_part[:2],16)!=checksum_calculated:print("校验和错误")returnNone# 分割字段fields=data_part.split(',')sentence_id=fields[0]ifsentence_id=='GPRMC':returnparse_gprmc(fields)elifsentence_id=='GPGGA':returnparse_gpgga(fields)else:returnfieldsdefparse_gprmc(fields):# 字段索引:0=GPRMC, 1= 时间, 2= 状态, 3= 纬度, 4=NS, 5= 经度, 6=EW, ...time_utc=fields[1]# 格式:HHMMSSstatus=fields[2]lat=float(fields[3])iffields[3]else0.0lat_dir=fields[4]lon=float(fields[5])iffields[5]else0.0lon_dir=fields[6]# 度分转换为十进制lat_dec=lat/100.0lat_dec=lat_deciflat_dir=='N'else-lat_declon_dec=lon/100.0lon_dec=lon_deciflon_dir=='E'else-lon_decreturn{'type':'GPRMC','time_utc':time_utc,'status':status,'latitude':lat_dec,'longitude':lon_dec}
2. 典型报文示例
(1)有效定位报文($GPRMC)
$GPRMC,123519,A,3723.2475,N,12158.3416,W,000.5,064.7,120598,020.3,E*68
解析结果:UTC 时间 12:35:19,定位有效,北纬 37.38745°,西经 121.97236°,速度 0.5 节,航向 64.7°,日期 12 日 5 月 1998 年,磁偏角 20.3°东。
(2)卫星状态报文($GPGSV)
$GPGSV,3,1,11,01,78,352,43,02,49,239,42,03,42,083,44,06,34,293,45*7F$GPGSV,3,2,11,07,22,329,41,08,16,046,39,10,17,238,40,12,28,143,47*7A$GPGSV,3,3,11,13,34,068,44,15,23,346,40,24,35,140,44*70
说明:共 3 条报文(3,1表示总 3 条,当前第 1 条),可见 11 颗卫星。每颗卫星包含 ID、仰角(°)、方位角(°)、信噪比(dBHz)。
3. 注意事项
时区转换:NMEA 时间为 UTC,需根据当地时区(如北京时间 + 8 小时)转换为本地时间。
数据刷新率:典型设备输出频率为 1Hz(每秒 1 条报文),高速运动场景需确认设备支持更高刷新率(如 5Hz、10Hz)。
多系统兼容:若设备支持北斗 /GLONASS,需识别语句前缀(如$BDGGA)并统一解析逻辑。
六、总结
NMEA-0183 协议凭借其简单性和跨平台兼容性,成为 GNSS 设备数据交互的事实标准,广泛应用于从航海到消费电子的多个领域。尽管面临更高效协议(如二进制格式)的挑战,其文本可读性和易于解析的特点,使其在低成本、低功耗场景中保持不可替代的地位。理解 NMEA-0183 报文结构是开发 GNSS 相关应用(如导航软件、定位终端)的基础,掌握其字段定义和校验机制是确保数据可靠性的关键。