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

树莓派中MPU 6050与GPS单独运行正常、同程序运行GPS无输出问题求助

问题根因

你遇到的并非硬件接口适配问题,核心是代码逻辑的时序和串口读取设计缺陷:

  1. GPS模块每秒会输出5~10条NMEA格式报文,你当前代码每次循环仅调用1次ser.readline(),搭配0.2秒的串口超时,加上循环末尾的1秒固定休眠,导致绝大多数GPS报文都未被读取就被丢弃,只有极低概率能命中要匹配的$GPRMC/$GPVTG报文。
  2. 单独运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:57:03