NMEA 协议开发
本文档说明 HiDiTing GNSS 与主机之间使用的 NMEA 和 GNBIN(GNSS BINary)协议。NMEA 适合读取文本定位信息;GNBIN 用于控制、查询、辅助数据注入及二进制上报。详细帧格式、字段定义、校验规则和十六进制示例均在后续章节保留。
概述
HiDiTing GNSS 对外提供两种数据接入方式:
- 直接 UART 接入:主机自行收发 GNBIN 外层和内层数据,并按照本指南解析 NMEA 或 GNBIN 消息。
- SDK 驱动接入:应用通过 GNSS 公开接口注册 NMEA/二进制回调和下发配置。驱动负责 GNBIN 外层协议适配,应用只处理内层 GNSS 业务数据。
NMEA 和 GNBIN 是协议契约,协议中的消息类、字段长度、字节序、校验和及下发时序应严格以本指南的详细定义执行。
协议准备
- 确认接入路径:串口直连时需要处理 GNBIN 外层分包;使用 SDK 驱动时,不应再人为拼接外层 0x7E 帧。
- 确认 GNSS 已完成板级供电、初始化和打开流程。完整接入顺序参见 GNSS集成开发指南。
- 仅使用公开 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 启用该样例。
- 按 GNSS集成开发指南 完成天线、供电和板级连接。
- 使用一站式 CLI 构建
pack_diting_community,将生成的diting-community.fwpkg烧录到目标板;以750000波特率打开 UART2 串口。 -
依次执行以下 AT 指令。每条指令返回
OK后再发送下一条: -
将开发板放在能够接收卫星信号的位置,持续观察 NMEA 输出。协议链路正常时可收到以
$开始、以*CS<CR><LF>结束的语句;完成定位时,RMC 的状态字段为A,或 GGA 的定位质量字段大于 0。启用保存后,数据文件位于/user/gnss/log/gnss_data_1.log,超过单文件限制后按编号轮转。 - 测试结束后依次执行
AT^GNSSSTOP和AT^GNSSDEINIT,确认均返回OK。如果长时间只有 RMCV或 GGA 定位质量为 0,先检查天线、测试环境和 GNSS 固件加载日志,不要将“收到 NMEA”误判为“定位成功”。 - 需要验证 UART 裸协议时,按本指南的外层帧、内层帧和控制类消息示例收发;相关测试条件参见 GNSS集成开发指南。
协议层次与代码路径
| 层次 | 责任 | 对应代码位置 |
|---|---|---|
| 应用层 | 注册 NMEA/二进制回调,调用公开接口下发内层消息 | src/application/samples/gnss/gnss_at_samples |
| GNSS 服务接口 | 定义 GNSS_CALLBACK_MSG、GNSS_CALLBACK_NMEA、gnss_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 |
- |
纬度方向:
|
5 |
lon |
dddmm.mmmmmm |
- |
经度(度、分格式,ddd表示整数度,小数点前的m表示整数分,小数点后的m表示小数m)。 |
6 |
EW |
char |
- |
经度方向:
|
7 |
quality |
digit |
- |
定位质量:
|
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 |
- |
磁偏角方向:
|
13 |
mode |
char |
- |
定位模式标志:
|
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 |
- |
定位切换模式:
|
3 |
navMode |
digit |
- |
导航状态:
|
以下内容按卫星数量(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 |
- |
纬度方向:
|
4 |
lon |
dddmm.mmmmmm |
- |
经度(度、分格式)。 |
5 |
EW |
char |
- |
经度方向:
|
6 |
time |
hhmmss.ss |
- |
当前定位对应的UTC时间。 |
7 |
status |
char |
- |
位置有效标志:
|
8 |
mode |
char |
- |
定位模式标志:
|
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 |
- |
定位错误码:
|
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 |
- |
回车换行符。 |