You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在树莓派4B上从串口输入解析GPS模块的GNGGA消息并实现RTK固定状态失效告警?

解决GPS RTK固定状态监测的Python实现方案

嘿,你已经迈出了最关键的第一步——定位到GNGGA消息的起始点!接下来咱们把这个逻辑落地,完整实现RTK固定状态的监控和失效告警。我会一步步拆解,给你可直接复用的代码和解释。

第一步:过滤并提取完整的GNGGA语句

串口读取的字节流里混着其他NMEA消息和噪声,咱们需要先把有效的GNGGA语句挑出来:

  • 首先把读取到的字节转成ASCII字符串(GPS模块默认用ASCII发送NMEA消息)
  • 过滤出以$GNGGA开头的行,因为这才是我们需要的定位数据帧
  • 确保拿到完整的语句(以\r\n结尾,或者校验和*XX结尾)

第二步:解析定位状态参数

GNGGA消息用逗号分隔字段,**第7个字段(索引从0开始是第6位)**就是定位类型:

  • 0:未定位
  • 1:单点定位
  • 2:差分定位
  • 4:RTK固定解(这就是我们要监控的目标状态)
  • 5:RTK浮点解(不算固定状态,需要触发告警)

第三步:实现监测和告警逻辑

持续监控这个字段,一旦状态不是4,就执行告警操作(比如打印日志、触发GPIO引脚、发送通知等)

修改后的完整代码

#!/usr/bin/env python
import time
import serial

# 初始化串口连接(注意检查设备路径是否正确,树莓派常见的是/dev/serial0或/dev/ttyAMA0)
ser = serial.Serial(
    port='/dev/serial/serial01',
    baudrate=460800,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=1
)

# RTK固定状态的标识值
RTK_FIXED_STATUS = "4"

try:
    while True:
        # 读取一行串口数据,转成ASCII字符串并去除首尾空白字符
        raw_data = ser.readline().decode('ascii', errors='ignore').strip()
        
        # 只处理GNGGA消息
        if raw_data.startswith('$GNGGA'):
            # 用逗号拆分字段
            gngga_fields = raw_data.split(',')
            
            # 确保字段数量足够(避免异常)
            if len(gngga_fields) >= 7:
                current_status = gngga_fields[6]
                print(f"当前定位状态: {current_status}")
                
                # 检查是否为RTK固定状态
                if current_status != RTK_FIXED_STATUS:
                    # 这里替换成你需要的告警逻辑
                    print("⚠️ 告警:GPS失去RTK固定状态!")
                    # 示例:触发GPIO告警(如果需要的话)
                    # import RPi.GPIO as GPIO
                    # GPIO.output(ALARM_PIN, GPIO.HIGH)
                    # time.sleep(1)
                    # GPIO.output(ALARM_PIN, GPIO.LOW)
        
        time.sleep(0.1)
        
except KeyboardInterrupt:
    print("程序被手动终止")
finally:
    ser.close()
    print("串口已关闭")

代码关键点解释

  1. decode('ascii', errors='ignore'):处理串口读取的字节,忽略不可读的噪声字符,只保留有效的ASCII内容
  2. startswith('$GNGGA'):精准过滤出我们需要的消息类型
  3. 字段拆分和状态判断:通过split(',')把GNGGA拆成单独字段,直接取第7个字段判断是否为RTK固定
  4. 异常处理:捕获键盘中断(Ctrl+C),确保程序终止时关闭串口,避免资源泄漏

额外建议

  • 检查串口设备路径:树莓派上的UART设备通常是/dev/serial0或者/dev/ttyAMA0,如果你的serial01不对,可以用ls /dev/serial*命令查看实际路径
  • 增加校验和验证:NMEA消息末尾有*XX校验和,你可以添加校验逻辑确保数据没有被篡改(比如计算消息内容的异或值和末尾的校验和对比)
  • 告警逻辑扩展:除了打印,你还可以触发GPIO控制的蜂鸣器/指示灯,或者通过MQTT发送告警消息到你的自动驾驶系统

内容的提问来源于stack exchange,提问作者GRS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:52:51