如何在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 # 修正计数器逻辑
关键修改说明
- 修正串口读取错误:把
line_Rover2 = sio_Rover1.readline()改成sio_Rover2.readline(),确保读取对应设备的数据 - 正确捕获ChecksumError:将
pynmea2.parse()放在try块内,专门捕获pynmea2.ChecksumError,跳过校验失败的NMEA语句,同时处理其他可能的异常 - 修复计数器逻辑:把
k += k改成k += 1,保证索引正常递增 - 增加空白字符处理:用
strip()去除读取行的首尾空白,避免空行或多余字符导致的解析错误 - 开启校验参数:把
check=False改成check=True,只解析校验通过的语句,保证数据可靠性,错误行直接跳过
内容的提问来源于stack exchange,提问作者Matheus Barbosa
相关产品推荐
相关产品推荐

