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