跳转至

NMEA 协议开发

本文档说明 HiDiTing GNSS 与主机之间使用的 NMEA 和 GNBIN(GNSS BINary)协议。NMEA 适合读取文本定位信息;GNBIN 用于控制、查询、辅助数据注入及二进制上报。详细帧格式、字段定义、校验规则和十六进制示例均在后续章节保留。

概述

HiDiTing GNSS 对外提供两种数据接入方式:

  • 直接 UART 接入:主机自行收发 GNBIN 外层和内层数据,并按照本指南解析 NMEA 或 GNBIN 消息。
  • SDK 驱动接入:应用通过 GNSS 公开接口注册 NMEA/二进制回调和下发配置。驱动负责 GNBIN 外层协议适配,应用只处理内层 GNSS 业务数据。

NMEA 和 GNBIN 是协议契约,协议中的消息类、字段长度、字节序、校验和及下发时序应严格以本指南的详细定义执行。

协议准备

  1. 确认接入路径:串口直连时需要处理 GNBIN 外层分包;使用 SDK 驱动时,不应再人为拼接外层 0x7E 帧。
  2. 确认 GNSS 已完成板级供电、初始化和打开流程。完整接入顺序参见 GNSS集成开发指南
  3. 仅使用公开 GNSS 接口进入驱动:
使用场景 公开接口
接收 NMEA 或 GNBIN 内层二进制数据 uapi_gnss_register_callback
向 GNSS 下发内层配置/查询/控制消息 uapi_gnss_config

公开接口的参数、返回值、回调类型和 gnss_message_t 结构以对应 API 参考为准,不在本指南重复展开。

快速验证

SDK 已集成 GNSS AT 样例,代码位于 src/application/samples/gnss/gnss_at_samples,当前 diting-community 配置通过 CONFIG_ENABLE_DITING_GNSS_SAMPLE 启用该样例。

  1. GNSS集成开发指南 完成天线、供电和板级连接。
  2. 使用一站式 CLI 构建 pack_diting_community,将生成的 diting-community.fwpkg 烧录到目标板;以 750000 波特率打开 UART2 串口。
  3. 依次执行以下 AT 指令。每条指令返回 OK 后再发送下一条:

    AT^GNSSINIT=1,1,0,0
    AT^GNSSSAMPLE=1
    AT^GNSSSTART
    
  4. 将开发板放在能够接收卫星信号的位置,持续观察 NMEA 输出。协议链路正常时可收到以 $ 开始、以 *CS<CR><LF> 结束的语句;完成定位时,RMC 的状态字段为 A,或 GGA 的定位质量字段大于 0。启用保存后,数据文件位于 /user/gnss/log/gnss_data_1.log,超过单文件限制后按编号轮转。

  5. 测试结束后依次执行 AT^GNSSSTOPAT^GNSSDEINIT,确认均返回 OK。如果长时间只有 RMC V 或 GGA 定位质量为 0,先检查天线、测试环境和 GNSS 固件加载日志,不要将“收到 NMEA”误判为“定位成功”。
  6. 需要验证 UART 裸协议时,按本指南的外层帧、内层帧和控制类消息示例收发;相关测试条件参见 GNSS集成开发指南

协议层次与代码路径

层次 责任 对应代码位置
应用层 注册 NMEA/二进制回调,调用公开接口下发内层消息 src/application/samples/gnss/gnss_at_samples
GNSS 服务接口 定义 GNSS_CALLBACK_MSGGNSS_CALLBACK_NMEAgnss_message_t 及公开接口 src/include/middleware/services/gnss/gnss_device.h
GNSS 驱动 适配外层传输、转发内层数据、等待控制类消息回执 src/middleware/chips/3322/gnss/gnss.c
NMEA 解析参考 识别 GGA、GSA、GSV、RMC、VTG、GLL、ZDA、TH000、TH001、TH002 src/ohos/drivers/peripheral/location/gnss/utils

使用 SDK 驱动时,uapi_gnss_config 接收的是 GNBIN 内层 gnss_message_t。直接 UART 接入才需要组装或解析外层帧;两种接入方式不能混用同一层的数据。

NMEA协议

NMEA协议概述

NMEA协议是以ASCII码为基础的一种明文协议,通过该协议可以将GNSS芯片解算出的时间、位置、速度等信息通过串口或其他通信接口输出给其他设备。

HiDiTing GNSS默认兼容NMEA0183 4.1标准协议。当前定义的标准输出语句为GGA、RMC、GSV、GSA、VTG、ZDA、GLL,具体以“NMEA消息类型列表”为准。

NMEA协议框架

NMEA协议以逗号分隔字段,协议框架如表1所示。

表 1 NMEA协议框架

$

Address

,Field,Field…

*Checksum

<CR><LF>

起始符

地址段

数据段

校验和段

结束符

每条语句起始符都固定为'$'

标准协议包括两部分:前2字符为发送器标识符,其余字符为消息。

以','分隔,后面是变长的数据内容,可以是字符,也可以是数字,也可以留空。

以'*'开始,后面紧跟两字节16进制校验和,校验和为'$'和'*'之间的内容(不含这两个字符)按字节进行异或运算的结果。

每条语句都以<CR><LF>结束。

消息样例如表2所示。

表 2 NMEA消息样例

$

Address

,Field,Field…

*Checksum

<CR><LF>

$

GNGLL

,3412.431698,N,10852.419449,E,094343.00,A,A

*70

\r\n

NMEA标识符

NMEA发送器标识符

NMEA发送器标识符用于描述当前语句对应的卫星系统或者自定义信息,定义如表1所示。

表 1 NMEA发送器标识符

类别

发送器

标识符

NMEA标准消息

BDS

GB

GPS

GP

Galileo

GA

GLONASS

GL

QZSS

GQ

Multi-GNSS

GN

NMEA自定义消息

自定义信息

PN

NMEA卫星信号标识符

表 1 NMEA卫星信号标识

signal

systemID

signalID

GPS L1C/A

1

1

GLONASS L1OF

2

1

Galileo E1C

3

7

BDS B1i

4

1

QZSS L1C/A

5

1

NMEA卫星编号标识符

表 1 NMEA卫星编号标识

GNSS

NMEA svid range

GNSS PRN range

PRN to svid

GPS L1C/A

1~32

1~32

PRN+0

GLONASS L1OF

65~88

1~24

PRN+64

Galileo E1C

1~36

1~36

PRN+0

BDS B1i

1~50

1~50

PRN+0

QZSS L1C/A

1~4

193~196

PRN-192

NMEA标准消息

支持的标准NMEA消息类型列表如表1所示。

表 1 NMEA消息类型列表

消息类型

说明

默认输出

GGA

接收机定位数据。

Y

RMC

推荐的最少专用导航数据。

Y

GSV

可见卫星数据。

Y

GSA

有效卫星与精度因子数据。

Y

VTG

对地速度与航向数据。

Y

ZDA

时间与日期数据。

Y

GLL

接收机地理位置数据。

Y

GGA

表 1 GGA消息格式

消息

GGA

说明

接收机时间、位置、定位模式等数据。

格式

$xxGGA,time,lat,NS,lon,EW,quality,numSV,HDOP,alt,altUnit,sep,sepUnit,age,station,

*CS<CR><LF>

示例

$GNGGA,094343.00,3412.431698,N,10852.419449,E,1,22,0.8,378.8,M,,M,,*67

表 2 GGA消息字段说明

字段

名称

格式

单位

说明

1

$xxGGA

string

-

消息ID,“xx”为系统标识符,见“表1”。

2

time

hhmmss.ss

-

当前定位对应的UTC时间。

3

lat

ddmm.mmmmmm

-

纬度(度、分格式)。

4

NS

char

-

纬度方向:

  • N:北。
  • S:南。

5

lon

dddmm.mmmmmm

-

经度(度、分格式,ddd表示整数度,小数点前的m表示整数分,小数点后的m表示小数m)。

6

EW

char

-

经度方向:

  • E:东。
  • W:西。

7

quality

digit

-

定位质量:

  • 0:定位无效。
  • 1:有效单点定位。

8

numSV

digit

-

用于定位的卫星数目。

9

HDOP

digit

-

水平精度因子。

10

alt

digit

m

海拔高度。

11

altUnit

char

-

高度单位,固定为字符M,表示米。

12

sep

digit

m

大地水准面至参考椭球面的距离。

13

sepUnit

char

-

高度单位,固定为字符M。

14

age

digit

s

差分数据龄期,未使用DGPS时该字段为空。

15

station

digit

-

差分数据站ID,未使用DGPS时该字段为空。

16

CS

hex

-

checksum校验和。

17

<CR><LF>

char

-

回车换行符。

RMC

表 1 RMC消息格式

消息

RMC

说明

推荐的最小定位信息。

格式

$xxRMC,time,status,lat,NS,lon,EW,speed,course,date,mag,magEW,mode,nav

*CS<CR><LF>

示例

$GNRMC,094343.00,A,3412.431698,N,10852.419449,E,003.3,013.7,240322,,E,A,V*78

表 2 RMC消息字段说明

字段

名称

格式

单位

说明

1

$xxRMC

string

-

消息ID,‘xx’为系统标识符,见“表1”。

2

time

hhmmss.ss

-

当前定位对应的UTC时间。

3

status

char

-

位置有效标志:

V:数据无效。

A:数据有效。

4

lat

ddmm.mmmmmm

-

纬度(度、分格式)。

5

NS

char

-

纬度方向:

N:北。

S:南。

6

lon

dddmm.mmmmmm

-

经度(度、分格式)。

7

EW

char

-

经度方向:

E:东。

W:西。

8

speed

digit

knots

对地速度。

9

course

digit

deg

对地真北航向。

10

date

ddmmyy

-

日期(日、月、年)。

11

mag

digit

deg

磁偏角。

12

magEW

char

-

磁偏角方向:

  • E:东。
  • W:西。

13

mode

char

-

定位模式标志:

  • N:数据无效。
  • A:自主模式。

14

nav

char

-

导航状态标志:

V:不输出导航状态(默认)。

15

CS

hex

-

校验和。

16

<CR><LF>

char

-

回车换行符。

GSV

表 1 GSV消息格式

消息

GSV

说明

可见卫星信息,包括卫星编号、高角度、方位角、载噪比等信息。每个卫星系统、每个频点单独输出一组GSV语句。

格式

$xxGSV,numMsg,msgNo,numSV,{,svid,ele,azi,cn0},signalID

*CS<CR><LF>

示例

$GBGSV,3,1,11,07,75,129,27,08,68,213,28,10,88,303,26,11,58,322,26,1*7D

$GBGSV,3,2,11,13,51,216,31,25,43,237,33,34,62,011,26,38,81,201,30,1*75

$GBGSV,3,3,11,40,64,107,30,42,17,157,29,43,38,289,27,1*47

表 2 GSV消息字段说明

字段

名称

格式

单位

说明

1

$xxGSV

string

-

消息ID,“xx”为系统标识符,见“表1”。

2

numMsg

digit

-

GSV语句总数,每条GSV最多输出4颗可见星,多余4颗时将切分为多条GSV。

3

msgNo

digit

-

GSV语句编号。

4

numSV

digit

-

可见卫星总数。

以下内容按单颗卫星循环填充,其中n为1~4

5+(n-1)×4

svid

digit

-

卫星编号,与PRN关系见“表1”。

6+(n-1)×4

ele

digit

deg

高度角:0°~90°,无效时为空。

7+(n-1)×4

azi

digit

deg

方位角:0°~359°,无效时为空。

8+(n-1)×4

cn0

digit

dBHz

载噪比:0~99,无效时为空。

以上内容按单颗卫星循环填充。以下N为本行GSV实际的总卫星数量。

5+N×4

signalID

hex

-

NMEA定义的GNSS信号标识符,见“表1”。N表示本条语句中实际卫星的数量。

6+N×4

CS

hex

-

校验和。

7+N×4

<CR><LF>

char

-

回车换行符。

GSA

表 1 GSA消息格式

消息

GSA

说明

定位模式及参与定位的卫星编号和DOP信息,多系统定位时,每个系统对应一条GSV语句,每条语句最多显示12颗卫星编号,实际参与定位的卫星数多于12颗时,仅输出前12颗卫星。

格式

$xxGSA,optMode,navMode,{,svid},PDOP,HDOP,VDOP,systemId

*CS<CR><LF>

示例

$GNGSA,A,3,7,8,10,11,13,25,34,38,40,42,43,,1.5,0.8,1.2,4*39

表 2 GSA消息字段说明

字段

名称

格式

单位

说明

1

$xxGSA

string

-

消息ID,“xx”为系统标识符,见“表1

2

optmode

char

-

定位切换模式:

  • M:手动切换2D/3D定位。
  • A:自动切换2D/2D定位(默认)。

3

navMode

digit

-

导航状态:

  • 1:无效。
  • 2:2D定位。
  • 3:3D定位。

以下内容按卫星数量(1..12)循环。

4+n

svid

digit

-

卫星编号,不足12颗时补空。与PRN关系见“表1”。

以上内容按卫星数量(1..12)循环。

16

PDOP

numeric

-

位置精度因子。

17

HDOP

numeric

-

水平精度因子。

18

VDOP

numeric

-

垂直精度因子

19

systemId

hex

-

NMEA定义的GNSS系统标识符,见“表1”。

20

CS

hex

-

校验和。

21

<CR><LF>

char

-

回车换行符。

VTG

表 1 VTG消息格式

消息

VTG

说明

对地速度与对地航向信息。

格式

$xxVTG,cogt,T,cogm,M,sog,N,kph,K,mode

*CS<CR><LF>

示例

$GNVTG,013.7,T,013.7,M,003.3,N,006.1,K,A*3A

表 2 VTG消息字段说明

字段

名称

格式

单位

说明

1

$xxVTG

string

-

消息ID,“xx”为系统标识符,见“表1”。

2

cogt

numeric

deg

对比真北航向。

3

T

char

-

真北标识,固定为T。

4

cogm

numeric

deg

对地磁北航向。

5

M

char

-

磁北标识,固定为M。

6

sog

numeric

knots

对地速度。

7

N

char

-

速度单位标识,固定为N。

8

kph

numeric

km/h

对地速度。

9

K

char

-

速度单位标识,固定为K。

10

mode

char

-

定位模式:N-数据无效,A-自主定位。

11

CS

hex

-

校验和。

12

<CR><LF>

char

-

回车换行符。

ZDA

表 1 ZDA消息格式

消息

ZDA

说明

时间和日期。

格式

$xxZDA,time,day,month,year,ltzh,ltzn

*CS<CR><LF>

示例

$GNZDA,094343.00,24,03,2022,00,00*76

表 2 ZDA消息字段说明

字段

名称

格式

单位

说明

1

$xxZDA

string

-

消息ID,“xx”为系统标识符,见“表1”。

2

time

hhmmss.ss

-

UTC时间,时分秒.秒格式。

3

day

dd

-

UTC日。

4

month

mm

-

UTC月。

5

year

yyyy

-

UTC年。

6

ltzh

hh

-

当地时区小时,固定为00。

7

ltzn

hh

-

当地时区分钟,固定为00。

8

CS

hex

-

校验和。

9

<CR><LF>

char

-

回车换行符。

GLL

表 1 GLL消息格式

消息

GLL

说明

纬度、经度、定位时间及定位状态等信息。

格式

$xxGLL,lat,NS,lon,EW,time,status,mode

*CS<CR><LF>

示例

$GNGLL,3412.433366,N,10852.420048,E,094345.00,A,A*7F

表 2 GLL消息字段说明

字段

名称

格式

单位

说明

1

$xxGLL

string

-

消息ID,“xx”为系统标识符,见“表1”。

2

lat

ddmm.mmmmmm

-

纬度(度、分格式)。

3

NS

char

-

纬度方向:

  • N:北。
  • S:南。

4

lon

dddmm.mmmmmm

-

经度(度、分格式)。

5

EW

char

-

经度方向:

  • E:东。
  • W:西。

6

time

hhmmss.ss

-

当前定位对应的UTC时间。

7

status

char

-

位置有效标志:

  • V:数据无效。
  • A:数据有效。

8

mode

char

-

定位模式标志:

  • N:数据无效。
  • A:自主模式。

9

CS

hex

-

校验和。

10

<CR><LF>

char

-

回车换行符。

NMEA自定义消息

HiDiTing GNSS支持的自定义NMEA消息类型列表如表1所示。

表 1 NMEA自定义消息

消息类型

说明

默认输出

TH000

接收机前端增益信息。

Y

TH001

接收机定位质量信息。

Y

TH002

接收机功耗模式信息。

Y

TH000

表 1 TH000消息格式

消息

TH000

说明

接收机前端增益信息。

格式

$PNTH000,item1,item2,item3,item4,item5,item6,item7,item8,

item9,item10*CS<CR><LF>

示例

$PNTH000,8,,-84,85,,,,,0,0*26

表 2 TH000消息字段说明

字段

名称

格式

单位

说明

1

$PNTH000

string

-

消息ID。

2

item1

digit

-

-

3

item2

digit

-

-

4

item3

digit

-

-

5

item4

digit

-

-

6

item5

digit

-

-

7

item6

digit

-

-

8

item7

digit

-

-

9

item8

digit

-

-

10

item9

hex

-

-

11

item10

hex

-

-

12

CS

hex

-

-

13

<CR><LF>

char

-

-

TH001

表 1 TH001消息格式

消息

TH001

说明

接收机定位质量信息。

格式

$PNTH001,item1,item2,item3,item4,errCode,inTrkNum,ephNum

*CS<CR><LF>

示例

$PNTH001,0.963778,1.47,0.77,7.41,0,15,105*1B

表 2 TH001消息字段说明

字段

名称

格式

单位

说明

1

$PNTH001

string

-

消息ID。

2

item1

numeric

-

-

3

item2

numeric

-

-

4

item3

numeric

-

-

5

qop

numeric

-

定位质量评估因子。

6

errCode

digit

-

定位错误码:

  • 0:已定位。
  • 1:跟踪卫星数小于5,未定位。
  • 2:有效星历个数小于5,未定位。
  • 3:精度不足定位被拦截,未定位。

7

errCode

digit

-

实际跟踪卫星数量。

8

ephNum

digit

-

有效星历数量。

9

CS

hex

-

校验和。

10

<CR><LF>

char

-

回车换行符。

TH002

表 1 TH002消息格式

消息

TH002

说明

接收机功耗模式信息。

格式

$PNTH002,item1,item2,item3,item4,item5,item6,item7,item8

*CS<CR><LF>

示例

$PNTH002,085505.00,T,-353.173867,3,240,0.012337,1,16.000000*7A

表 2 TH002消息字段说明

字段

名称

格式

单位

说明

1

$PNTH002

string

-

消息ID。

2

item1

hhmmss.ss

-

-

3

item2

char

-

-

4

item3

numeric

-

-

5

item4

digit

-

-

6

item5

hex

-

-

7

item6

numeric

-

-

8

item7

digit

-

-

9

item8

numeric

-

-

10

CS

hex

-

校验和。

11

<CR><LF>

char

-

回车换行符。