1. NMEA 0183 协议
• 定义:
NMEA 0183 是由美国国家海洋电子协会(National Marine Electronics Association)制定的标准通信协议,用于船舶导航设备和传感器之间的数据传输。
• 核心特点:
• ASCII 文本格式:数据以可读的文本形式传输。
• 串行通信:通常通过 RS-232 或 RS-422 接口传输。
• 语句结构:每条数据以 $
开头,以 *
加校验和结尾,字段间用逗号分隔。
• 应用场景:
GPS 接收机、船舶导航仪、自动驾驶系统等。
2. GNGGA 语句(Global Navigation Satellite System Fix Data)
• 功能:
提供 时间、位置、定位状态、卫星数量 等基本信息。
• 典型格式:
$GNGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
• 字段解析:
字段序号 | 含义 | 示例值 | 说明 |
---|---|---|---|
1 | UTC 时间 | 123519 | 格式为 HHMMSS.SS (12:35:19) |
2 | 纬度(度分格式) | 4807.038 | 格式为 DDMM.MMMM (48度07.038分) |
3 | 纬度半球 | N | N(北纬)或 S(南纬) |
4 | 经度(度分格式) | 01131.000 | 格式为 DDDMM.MMMM (011度31.000分) |
5 | 经度半球 | E | E(东经)或 W(西经) |
6 | 定位状态 | 1 | 0=无效,1=单点定位,2=差分定位 |
7 | 使用的卫星数量 | 08 | 当前用于定位的卫星数量(0-12) |
8 | 水平精度因子(HDOP) | 0.9 | 值越小,定位精度越高 |
9 | 海拔高度 | 545.4 | 单位:米 |
10 | 高度单位 | M | 固定为 M(米) |
11 | 大地水准面高度 | 46.9 | 相对于椭球面的高度差(米) |
12 | 高度单位 | M | 固定为 M(米) |
13 | 差分数据年龄(秒) | (空) | 仅差分定位时有效 |
14 | 差分参考站 ID | (空) | 差分基站编号 |
15 | 校验和 | *47 | 校验和(用于验证数据完整性) |
3. GNRMC 语句(Recommended Minimum Navigation Data)
• 功能:
提供 时间、日期、位置、速度、航向 等最小推荐导航数据。
• 典型格式:
$GNRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
• 字段解析:
字段序号 | 含义 | 示例值 | 说明 |
---|---|---|---|
1 | UTC 时间 | 123519 | 格式为 HHMMSS.SS (12:35:19) |
2 | 定位状态 | A | A=有效,V=无效 |
3 | 纬度(度分格式) | 4807.038 | 格式同 GNGGA |
4 | 纬度半球 | N | N/S |
5 | 经度(度分格式) | 01131.000 | 格式同 GNGGA |
6 | 经度半球 | E | E/W |
7 | 地面速度(节) | 022.4 | 1节=1.852公里/小时 |
8 | 地面航向(真北) | 084.4 | 单位:度(0-359.9) |
9 | UTC 日期 | 230394 | 格式为 DDMMYY (23日03月1994年) |
10 | 磁偏角 | 003.1 | 单位:度 |
11 | 磁偏角方向 | W | E(东)或 W(西) |
12 | 校验和 | *6A | 校验和 |
4. 关键区别
特性 | GNGGA | GNRMC |
---|---|---|
核心数据 | 时间、位置、海拔、卫星数量 | 时间、位置、速度、航向、日期 |
适用场景 | 需要详细定位信息的应用(如测绘) | 导航和运动状态监测(如船舶、车辆) |
速度信息 | 无 | 提供地面速度和航向 |
日期信息 | 无 | 包含 UTC 日期 |
5. 实际应用示例
• 解析 GNGGA 获取海拔高度:
# 示例代码片段
gngga = "$GNGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47"
fields = gngga.split(',')
altitude = float(fields[9]) # 海拔高度:545.4 米
• 解析 GNRMC 计算速度(公里/小时):
gnrmc = "$GNRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A"
fields = gnrmc.split(',')
speed_knots = float(fields[7]) # 速度(节)
speed_kmh = speed_knots * 1.852 # 转换为公里/小时:41.5 km/h
6. 注意事项
• 校验和验证:
校验和是 $
和 *
之间所有字符的异或值,用于检测数据传输中的错误。
• 字段为空:
若某字段无数据,则保留逗号占位(如 ,,
)。
• 多系统支持:
GN
前缀表示数据来自多系统(如 GPS + GLONASS),纯 GPS 设备可能使用 GP
前缀(如 GPGGA
)。
通过解析这些语句,可以获取 GPS 设备的核心导航数据,适用于车辆追踪、航海导航、无人机控制等场景。