3. 报文帧结构与语法规则
NMEA 0183 报文看起来只是一行以逗号分隔的文本,但它能被不同厂家的设备正确解析,靠的是一套严格的帧结构与语法约定。理解这套约定,是从“能看懂某条报文”走向“能判断报文是否合法、能否被设备接受”的关键一步。本节以最常见的语句型报文为对象,逐段拆解帧结构,并说明各字段的语法规则与长度限制。
一、一条完整报文的帧结构
NMEA 0183 的语句型报文(Sentence)由若干固定位置的部分组成,按出现顺序依次为:起始符、地址字段、若干数据字段、校验和字段、结束符。字段之间用字段分隔符隔开,校验和之前用“*”引导。以一条常见的 GGA 报文为例:
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
逐段对应如下:起始符“$”;地址字段“GPGGA”;数据字段从“123519”到最后一个逗号后的空字段;校验和字段“*47”;结束符为行尾的 CR LF(回车换行)。理解这条报文的结构,就理解了绝大多数 NMEA 语句的通用骨架。
二、起始符与地址字段
起始符固定为“$”,它告诉接收端“从这里开始是一条新语句”。在连续数据流中,接收程序通常以“$”作为帧同步点,丢弃其前的杂散字符。因此起始符不仅是格式要求,也是实现帧同步的物理依据。
地址字段紧跟在“$”之后,由两部分组成:前两位是发送方标识(Talker ID),后三位是语句类型(Sentence Formatter)。例如“GP”表示 GPS 定位设备,“GL”表示 GLONASS,“GN”表示多系统联合定位,“HC”表示磁罗经,“II”表示集成导航设备。语句类型如 GGA、RMC、VTG、HDT、GLL 等,决定了后续数据字段的数量、顺序和含义。识读报文时,先看地址字段,就能大致判断这条报文提供的是什么信息、由哪类设备发出。
需要特别注意的是,地址字段的五个字符都是大写字母,且不能包含数字或符号。若接收端读到“$GPGG1”这类地址,应视为非法语句而丢弃。
三、数据字段与字段分隔符
数据字段是报文的主体,字段之间用逗号分隔。每个字段的位置由语句类型严格定义,例如 GGA 的第 1 个数据字段是 UTC 时间,第 2、3 个是纬度及半球,第 4、5 个是经度及半球,第 6 个是定位质量指示。字段的顺序不能调换,也不能随意增删,否则接收端会按错误的位置解读数据。
空字段是识读中的常见难点。当两个逗号紧挨出现,或“*”前出现逗号时,表示该位置字段为空,即当前无有效数据。例如 GGA 报文末尾“,,*47”表示差分龄期和差分站 ID 两个字段均为空。空字段不是错误,而是协议允许的“无数据”表达方式,接收端必须按位置跳过而不是压缩字段。
字段内容也有字符集限制:一般只允许可打印 ASCII 字符,且不得包含逗号、“$”、“*”等具有语法含义的字符。若数据本身含有这些字符,需按协议规定的方式处理,而不能直接写入字段。
四、校验和字段
校验和用于检测传输过程中的字符错误。计算范围是起始符“$”与星号“*”之间的全部字符(即地址字段和所有数据字段,含其中的逗号),但不包括“$”和“*”本身。计算方法是将这些字符的 ASCII 码逐字节进行异或运算,结果用两位大写十六进制表示。
以“$GPGGA,123519,...*47”为例,把“GPGGA,123519,...”(即 $ 与 * 之间的内容)逐字符异或,得到的结果应等于十六进制的 47。接收端收到报文后重新计算并比对,若不一致则判定该句在传输中出错,通常整句丢弃。校验和不通过时,不应“猜测”数据内容继续使用,这是识读与解析中必须坚持的原则。
五、结束符与长度限制
每条语句以回车(CR,0x0D)加换行(LF,0x0A)结束。接收端以 CR LF 作为一行结束的判断依据,因此发送端必须完整输出这两个字符,不能只发 LF 或省略。若一行报文缺少结束符,接收端可能一直等待后续字符,导致整帧超时或错位。
NMEA 0183 对单句长度有明确限制:一条语句的总长度(含起始符、校验和字段与 CR LF)不超过 82 个字符。这一限制源于早期串口缓冲与实时性要求,至今仍是判断报文是否合规的重要依据。当一条语句需要承载的数据超过限制时,协议采用多句分片的方式传输,而不是无限加长单句。识读时若发现某行明显超过 82 字符,应怀疑是拼接错误、缓存未清或非标准扩展,不能直接当作标准报文处理。
六、识读与合法性判断的实操要点
面对一行实际报文,可按以下顺序快速判断其结构是否合法:第一,确认以“$”开头、以 CR LF 结尾;第二,检查地址字段是否为 5 个大写字母;第三,按语句类型核对数据字段的数量与顺序,识别空字段位置;第四,找到“*”,确认其后恰好两位十六进制字符;第五,重算校验和并比对;第六,检查整行长度是否在 82 字符以内。六项全部通过,才可认为该报文在帧结构层面合法,再进入具体数据含义的解读。
这套判断顺序的价值在于把“看报文”变成“验报文”。实际设备通信异常时,很多问题并非数据含义错误,而是起始符丢失、字段错位、校验和不符或结束符缺失。掌握帧结构与语法规则,就能在解析数据之前先排除格式层面的故障,为后续按语句类型逐字段识读打下可靠基础。