如何解决树莓派 Smbus I2C 通信 Arduino throw Erro 121
我一直在尝试使用带有 Smbus 库的 I2C 总线将命令从 Raspberry PI 3 发送到 Arduino。 编写代码以便您可以将 PWM 值从树莓派发送到 arduino 以驱动电机,同时 arduino 返回有关电机速度的变量。 检测工作正常,程序运行几个时期,直到它崩溃并抛出错误 121 远程 I/O。 在网上进行了大量搜索后,我尝试应用修复程序来解决该问题,但似乎没有任何效果。
Python 代码抛出错误
bus.write_i2c_block_data(0x13,data) # Error 121 after a random runtime
block = bus.read_i2c_block_data(0x13,numBytes) # Error 121 after a random runtime
我正在探索下一个解决方案:
- 强制程序在出错时重新运行(smbus 抛出错误导致整个脚本停止)
- 设置 i2c 时钟频率
- 在程序中使用 time.sleep 让 I2C 命令完全执行
当电机发生变化(速度、方向)时,连接似乎变得不稳定,电路上可能存在来自这些电荷的噪声。
是否可以忽略错误,刷新总线以获取额外信息并重新启动进程?
非常感谢您的帮助。
解决方法
经过更多研究,我发现了一篇关于 raspberry stackexchange 的帖子,指出了我面临的问题。
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
这会忽略总线通信错误并继续运行程序。在下一个时期,该函数将再次运行。
正在寻找一种方法来清除带有剩余数据的总线。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。