树莓派 Smbus I2C 通信 Arduino throw Erro 121

时间:2021-06-10 11:47:28

标签: arduino raspberry-pi i2c

我一直在尝试使用带有 Smbus 库的 I2C 总线将命令从 Raspberry PI 3 发送到 Arduino。 编写代码以便您可以将 PWM 值从树莓派发送到 arduino 以驱动电机,同时 arduino 返回有关电机速度的变量。 检测工作正常,程序运行几个时期,直到它崩溃并抛出错误 121 远程 I/O。 在网上进行了大量搜索后,我尝试应用修复程序来解决该问题,但似乎没有任何效果。

Python 代码抛出错误

bus.write_i2c_block_data(0x13, 0, data) # Error 121 after a random runtime


block = bus.read_i2c_block_data(0x13, 0, numBytes) # Error 121 after a random runtime

我正在探索下一个解决方案:

  1. 强制程序在出错时重新运行(smbus 抛出错误导致整个脚本停止)
  2. 设置 i2c 时钟频率
  3. 在程序中使用 time.sleep 让 I2C 命令完全执行

当电机发生变化(速度、方向)时,连接似乎变得不稳定,电路上可能存在来自这些电荷的噪声。

是否可以忽略错误,刷新总线以获取额外信息并重新启动进程?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

经过更多研究,我发现了一篇关于 raspberry stackexchange 的帖子,指出了我面临的问题。

https://raspberrypi.stackexchange.com/questions/104975/how-to-automatically-rerun-python-script-if-error-occurs

while True:
  <all your code>

  if <some error occurs>:
     time.sleep(10)
     continue

正确的说法是使用try and except IOError调用continue on error

while True:
    try:
       bus.write_byte()

    except IOError:
       continue

这会忽略总线通信错误并继续运行程序。在下一个时期,该函数将再次运行。

正在寻找一种方法来清除带有剩余数据的总线。