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

如何在Python中使用pynmea2处理NMEA数据时忽略ChecksumError?

解决pynmea2 ChecksumError并修正代码问题

核心问题分析

你的代码存在三个关键问题,导致报错和逻辑异常:

  • 读取Rover2数据时错误使用了Rover1的串口对象,两个变量实际读的是同一个端口的数据
  • pynmea2.parse()抛出ChecksumError时,你的try/except块没包住这个调用,根本没起到捕获错误的作用
  • 计数器k的更新逻辑错误(k += k会让k一直是0,无法正确索引列表)

修正后的代码

import pynmea2
import serial
import io
from pyproj import Proj
import numpy as np

# 存储经纬度的列表
lat_Rover1 = []
lat_Rover2 = []
lon_Rover1 = []
lon_Rover2 = []

# 初始化串口
# ROVER 1
serial_port_Rover1 = 'COM3'
ser_Rover1 = serial.Serial(serial_port_Rover1, timeout=3)
sio_Rover1 = io.TextIOWrapper(io.BufferedRWPair(ser_Rover1, ser_Rover1))

# ROVER 2
serial_port_Rover2 = 'COM4'
ser_Rover2 = serial.Serial(serial_port_Rover2, timeout=3)
sio_Rover2 = io.TextIOWrapper(io.BufferedRWPair(ser_Rover2, ser_Rover2))

k = 0
while True:
    # 处理Rover1的数据
    line_Rover1 = sio_Rover1.readline().strip()  # 去除首尾空白,避免空行干扰
    msg_Rover1 = None
    try:
        # 捕获校验错误,跳过无效行
        msg_Rover1 = pynmea2.parse(line_Rover1, check=True)
    except pynmea2.ChecksumError:
        print(f"Rover1校验错误,跳过该行: {line_Rover1}")
        continue
    except Exception as e:
        # 处理空行、格式错误等其他异常
        print(f"Rover1处理异常: {e}")
        continue

    # 处理Rover2的数据
    line_Rover2 = sio_Rover2.readline().strip()  # 修正:用对应串口读取
    msg_Rover2 = None
    try:
        msg_Rover2 = pynmea2.parse(line_Rover2, check=True)
    except pynmea2.ChecksumError:
        print(f"Rover2校验错误,跳过该行: {line_Rover2}")
        continue
    except Exception as e:
        print(f"Rover2处理异常: {e}")
        continue

    # 保存Rover1的GLL数据
    if msg_Rover1.sentence_type == 'GLL':
        with open("NMEAOutputs_Rover1.txt", "a") as outputs:
            lat = -pynmea2.dm_to_sd(msg_Rover1.data[0])
            lon = -pynmea2.dm_to_sd(msg_Rover1.data[2])
            lat_Rover1.append(lat)
            lon_Rover1.append(lon)
            print(f"{lat};{lon};{pynmea2.timestamp(msg_Rover1.data[4])}", file=outputs)
            print(f"Rover1记录: {lat}, {lon}")

    # 保存Rover2的GLL数据
    if msg_Rover2.sentence_type == 'GLL':
        with open("NMEAOutputs_Rover2.txt", "a") as outputs:
            lat = -pynmea2.dm_to_sd(msg_Rover2.data[0])
            lon = -pynmea2.dm_to_sd(msg_Rover2.data[2])
            lat_Rover2.append(lat)
            lon_Rover2.append(lon)
            print(f"{lat};{lon};{pynmea2.timestamp(msg_Rover2.data[4])}", file=outputs)
            print(f"Rover2记录: {lat}, {lon}")

    k += 1  # 修正计数器逻辑

关键修改说明

  1. 修正串口读取错误:把line_Rover2 = sio_Rover1.readline()改成sio_Rover2.readline(),确保读取对应设备的数据
  2. 正确捕获ChecksumError:将pynmea2.parse()放在try块内,专门捕获pynmea2.ChecksumError,跳过校验失败的NMEA语句,同时处理其他可能的异常
  3. 修复计数器逻辑:把k += k改成k += 1,保证索引正常递增
  4. 增加空白字符处理:用strip()去除读取行的首尾空白,避免空行或多余字符导致的解析错误
  5. 开启校验参数:把check=False改成check=True,只解析校验通过的语句,保证数据可靠性,错误行直接跳过

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:44:54