Adafruit GPS breakout输出非NMEA编码字节的Python解码问询
解决Adafruit GPS模块串口读取乱码问题
问题分析
你读取到的乱码字节流,核心原因大概率是串口参数不匹配或读取逻辑适配问题:虽然你确认波特率为9600,但Adafruit部分GPS模块默认波特率是115200而非9600;另外,串口数据位、停止位、奇偶校验的配置如果和模块不一致,也会导致输出乱码。同时readline()依赖换行符,若GPS输出的终止符不是预期的\n,也会造成不完整读取引发乱码。
解决方案
1. 匹配GPS模块的标准串口参数
Adafruit GPS模块通用默认参数:
- 波特率:115200(部分老型号为9600)
- 数据位:8
- 停止位:1
- 奇偶校验:无
修改代码的串口初始化逻辑,优先尝试115200波特率:
import serial n = 0 # 明确配置所有串口参数,匹配GPS模块默认值 ser = serial.Serial( port='COM2', baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_1, bytesize=serial.EIGHTBITS, timeout=0.5 ) while n < 10: data = ser.readline() n += 1 print(n) # 用ASCII解码,忽略无效字符(NMEA协议为ASCII编码) try: decoded_data = data.decode('ascii', errors='ignore') print(decoded_data, flush=True) except Exception as e: print(f"解码错误: {e}", flush=True) ser.close()
2. 硬件与连接验证
- 检查GPS模块供电是否稳定,供电不足会直接导致输出乱码
- 用串口调试工具(如PuTTY、串口助手)直接连接COM2,设置对应波特率,查看是否能输出
$GPGGA等标准NMEA语句:- 若调试工具也乱码,说明波特率或硬件连接有问题
- 若调试工具正常,再回到代码排查读取逻辑
3. 优化读取逻辑适配NMEA终止符
NMEA协议的语句终止符通常是\r\n,可替换readline()为read_until()指定终止符,避免不完整读取:
# 替换原readline语句,指定NMEA标准终止符 data = ser.read_until(b'\r\n')
关键提示
正常解码后应该能看到类似$GPGGA,123519,4807.038,N,00114.323,W,1,08,0.9,545.4,M,46.9,M,,*47的标准NMEA语句。若仍乱码,可通过AT指令修改GPS模块的波特率,使其与代码配置一致。
内容的提问来源于stack exchange,提问作者Stuart Stahl
相关产品推荐
相关产品推荐

