3. NMEA 0183语句结构与常用语句解析

在船舶NMEA网络中,接线只是基础,真正决定调试效率的是能否读懂语句。NMEA 0183采用ASCII文本、串行异步传输,一条语句就是一帧数据,从起始符到回车换行结束。理解语句的“骨架”,再掌握几条高频语句的字段含义,就能在调试时快速判断数据是否正常、字段是否错位、校验是否通过。

一、语句格式:从$到校验和的完整结构

一条标准NMEA 0183语句的结构如下:

$--XXX,字段1,字段2,...,字段n*hh<CR><LF>

各部分的含义:

  • $:语句起始符,接收方据此开始同步。
  • --:发送设备标识(Talker ID),两位字母,如GP表示GPS、GN表示多系统组合定位、HC表示航向设备、II表示集成仪表。
  • XXX:语句类型标识,三位字母,如GGA、GLL、VTG、RMC、HDT、HDG。
  • 逗号分隔的字段:数据主体,字段顺序和含义由语句类型固定定义,空字段表示该项无数据,但逗号不能省略。
  • *hh:校验和,两位十六进制数,对$与*之间的所有字符逐字节异或得到。
  • <CR><LF>:回车换行,标志语句结束。

需要特别注意:字段位置是“按序定位”的,不能因为某字段为空就跳过逗号。例如GGA语句中若定位质量为0,后续字段仍要保留占位,否则解析端会整体错位,这是现场最常见的解析故障之一。

二、校验和计算:逐字节异或

校验和的计算范围是起始符$之后、星号*之前的全部字符(含逗号),不含$和*。计算方法是将每个字符的ASCII码逐字节进行异或,结果用两位大写十六进制表示。

以一条示例语句为例(示例数据,用于演示计算过程):

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47

取$与*之间的字符串 GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,,逐字符异或,最终得到0x47,即校验和为“47”,与语句末尾一致。调试时若校验不通过,常见原因有三类:接线引入的误码、波特率不匹配导致的字符错位、以及发送端本身未正确计算校验和。可以先用串口助手抓取原始字节,确认$与*之间的内容是否完整,再手工或借助工具复算。

部分设备允许关闭校验和输出,但接收端若强制校验,就会丢弃这些语句。调试时先确认双方对校验和的处理策略是否一致。

三、定位语句:GGA、GLL、VTG、RMC

GGA是最常用的定位质量语句,核心字段依次为:UTC时间(hhmmss.ss)、纬度(ddmm.mmmm)、南北半球、经度(dddmm.mmmm)、东西半球、定位质量(0无效、1单点、2差分、4RTK固定、5RTK浮动等)、使用卫星数、HDOP水平精度因子、天线海拔高度、高度单位、大地水准面差距、差分龄期、差分站ID。调试时重点看定位质量与卫星数:质量为0说明未定位,质量为4/5说明进入RTK状态。

GLL更简洁,只给纬度、经度、UTC时间和状态(A有效、V无效),适合只需要位置坐标的场合。

VTG提供对地航向与对地速度:真航向、磁航向、对地速度(节)、对地速度(千米/小时)、模式指示。它常与GGA配合,用于判断船舶运动方向与速度。

RMC是“推荐最小定位信息”,包含UTC时间、状态、纬度、经度、对地速度、对地航向、日期、磁偏角及方向、模式指示。它同时给出位置、速度、航向和日期,是很多导航设备默认解析的核心语句。

四、航向语句:HDT与HDG

HDT(真航向)字段为:真航向角度、T(真北标志)。例如 $HCHDT,054.7,T*... 表示真航向54.7度。它来自电罗经或航向传感器,是船舶姿态的基础数据。

HDG(航向、偏差与磁偏角)字段为:磁航向、偏差、偏差方向(E/W)、磁偏角、磁偏角方向(E/W)。它同时给出磁航向和磁偏角信息,便于在磁北与真北之间换算。调试时要区分HDT与HDG:前者是真北基准,后者以磁北为基准并附带偏差修正量,混用会导致航向显示偏差。

五、解析流程与现场判断

实际解析一条语句,建议按“同步—校验—分字段—按类型映射”的顺序处理:先找到$起始,截取到*为止;复算校验和并比对;通过后按逗号切分字段;再根据语句类型把字段映射到对应变量。下图展示了一条GGA语句从原始字节到字段解析的完整数据流,以及校验失败时的分支处理。

NMEA 0183 语句解析数据流(以GGA为例) 串口原始字节 $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47<CR><LF> ① 帧同步 定位 $ 与 * 边界 截取有效载荷 ② 校验和复算 逐字节异或 比对 *47 校验通过? 是 / 否 丢弃并记录 查波特率/接线/发送端 校验算法 ③ 逗号切分 保留空字段占位 按序编号 ④ 类型映射 识别 GPGGA 套用字段定义 解析结果(示例数据) 时间 12:35:19 纬度 48°07.038′N 经度 011°31.000′E 定位质量 1(单点) 卫星数 08 HDOP 0.9 海拔 545.4 M 差分龄期 空 判断:质量为1且卫星数≥4,位置可用;若质量为0则标记定位无效,不参与航迹推算。 否 是

现场调试时,可以按以下要点快速判断:若所有语句都校验失败,优先怀疑波特率或接线极性;若只有某类语句失败,检查发送端该语句的校验算法;若校验通过但字段明显错位,检查是否漏掉了空字段的逗号;若GGA质量长期为0,检查天线视野、卫星数以及是否处于差分/RTK覆盖范围。HDT与HDG同时存在时,确认导航显示使用的是真北还是磁北基准,避免航向读数与海图方向不一致。

解析端不要假设字段一定非空。GGA的差分龄期、差分站ID,HDG的偏差字段都可能为空,程序必须按位置索引取值,而不是按“第几个非空字段”取值。