如何修复树莓派4B GPS模块的UnicodeDecodeError错误
修复串口GPS模块的解码与解析错误问题
修复后的代码
import serial import pynmea2 import datetime ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=0.5) while True: try: # 直接读取字节数据,避免自动解码报错 line_bytes = ser.readline() # 解码时忽略无效字节,清理空白字符 line = line_bytes.decode('utf-8', errors='ignore').strip() # 只处理标准NMEA语句(以$开头) if not line.startswith('$'): continue msg = pynmea2.parse(line) if msg.sentence_type == 'GGA': ts = datetime.datetime.now() lat = msg.latitude lon = msg.longitude alt = msg.altitude gps = f"{ts}|{lat}|{lon}|{alt}" print(gps) except serial.SerialException as e: print(f'设备错误: {e}') break # 捕获解码和解析错误,跳过无效行继续运行 except (UnicodeDecodeError, pynmea2.ParseError): continue
修改说明
- 替换TextIOWrapper:放弃自动解码的文本包装器,直接读取字节数据,手动解码时通过
errors='ignore'忽略无效字节,避免解码崩溃。 - 过滤无效数据:只处理以
$开头的标准NMEA语句,直接跳过模块初始化阶段发送的乱码或非标准字节。 - 补充异常捕获:新增对
UnicodeDecodeError和pynmea2.ParseError的捕获,遇到无效数据时直接跳过当前行,程序不会中断,持续等待有效GPS数据。 - 优化字符串拼接:用f-string替代传统拼接方式,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Pedro Silva
相关产品推荐
相关产品推荐

