树莓派I2C读取BMP388时报Errno 121 Remote I/O错误如何解决
I2C
IOError: [Errno 121] Remote I/O error 排查修复方案 该报错本质是主控无法通过I2C总线和目标传感器建立正常通信,按以下顺序排查即可:
1. 硬件层检查
- 接线校验:确认SDA、SCL引脚和主控对应接口无接反,VCC电压匹配BMP388要求(绝大多数为3.3V,禁止接5V避免烧毁传感器),GND和主控完全共地,排除杜邦线松动、虚焊问题
- 上拉电阻确认:I2C总线的SDA、SCL引脚必须接4.7kΩ左右的上拉电阻到VCC,部分成品BMP388模块自带上拉,裸片必须外接,否则总线电平异常会直接导致通信失败
2. 系统配置检查
- 确认主控已开启I2C功能,以树莓派为例,可运行
raspi-config在接口设置中开启I2C,修改后需重启生效 - 确认当前用户拥有I2C设备访问权限,执行
sudo usermod -aG i2c 你的用户名添加权限,临时测试可直接用sudo运行脚本验证 - 总线编号校验:如果用的是非树莓派的主控,确认代码里
smbus.SMBus(1)的总线编号和实际硬件启用的I2C总线编号一致,填错总线号也会找不到设备
3. 设备地址校验
- 先安装i2c扫描工具:
sudo apt install i2c-tools - 扫描当前I2C总线上的挂载设备:
sudo i2cdetect -y 1(老版本树莓派替换为sudo i2cdetect -y 0) - 对照扫描结果处理:
- 结果中无
76/77地址:回到硬件检查环节,确认传感器接线和供电正常 - 结果中出现
77而非76:将代码中I2C_ADD_BMP388 = I2C_ADD_BMP388_AD0_LOW修改为I2C_ADD_BMP388 = I2C_ADD_BMP388_AD0_HIGH即可,地址不匹配是该报错的最常见诱因
- 结果中无
4. 代码稳定性优化
如果上述排查全部正常,可对代码做简单优化降低偶发通信失败概率:
- 给I2C读写操作加3次以内的重试逻辑,单次间隔10ms,避免总线瞬时波动直接抛出错误
- 把传感器初始化复位后的等待时间从
time.sleep(0.01)改为time.sleep(0.1),给传感器留足复位就绪时间,避免未就绪状态下通信失败
内容的提问来源于stack exchange,提问作者matrunaydo
相关产品推荐
相关产品推荐

