树莓派中MPU 6050与GPS单独运行正常、同程序运行GPS无输出问题求助
问题根因
你遇到的并非硬件接口适配问题,核心是代码逻辑的时序和串口读取设计缺陷:
- GPS模块每秒会输出5~10条NMEA格式报文,你当前代码每次循环仅调用1次
ser.readline(),搭配0.2秒的串口超时,加上循环末尾的1秒固定休眠,导致绝大多数GPS报文都未被读取就被丢弃,只有极低概率能命中要匹配的$GPRMC/$GPVTG报文。 - 单独运行GPS代码时无长休眠逻辑,能连续读取串口数据,所以功能正常。
解决方案
- 重构GPS串口读取逻辑:每次循环优先读取串口缓冲区中所有可用报文,避免漏读,替换原有GPS读取部分的代码如下:
# 替换原代码中 newdata=ser.readline() 开始的两段if判断代码 while ser.in_waiting > 0: # 对串口读取的字节做解码,忽略乱码 newdata = ser.readline().decode('utf-8', errors='ignore').strip() # 过滤长度不足的无效报文 if len(newdata) < 6: continue if newdata[0:6] == "$GPRMC": try: newmsg = pynmea2.parse(newdata) lat = newmsg.latitude lng = newmsg.longitude gps = f"Latitude={lat} and Longitude={lng}" print(gps) except Exception as e: # 解析失败跳过,避免程序崩溃 continue if newdata[0:6] == "$GPVTG": try: newmsg = pynmea2.parse(newdata) speed = newmsg.spd_over_grnd_kmph speed_output = f"Speed= {speed}KM/H" print(speed_output) except Exception as e: continue
- 调整全局休眠逻辑:将末尾的
time.sleep(1)修改为time.sleep(0.1),既不会让循环空转占满CPU,也不会阻塞GPS报文的连续读取。如果需要保持MPU6050每秒1次的采样频率,可以单独为MPU采样添加计时判断,不要用全局休眠限制所有模块的执行节奏。 - 排查硬件冲突:如果修改代码后仍无GPS输出,确认两个设备的引脚无复用冲突:MPU6050使用的I2C引脚(默认GPIO2、GPIO3)不要和GPS使用的串口引脚(默认GPIO14、GPIO15)重合,也不要将同一GPIO接入多个设备。
内容的提问来源于stack exchange,提问作者Faisal Aldhuwayhi
相关产品推荐
相关产品推荐

