我已经连接了一个树莓派 http://en.wikipedia.org/wiki/Raspberry_Pi and 彩虹杜伊诺 http://en.wikipedia.org/wiki/List_of_Arduino_boards_and_compatible_systems#Software-compatibility_only和自制的一起I²C http://en.wikipedia.org/wiki/I%C2%B2C电平转换器,并安装了Python http://en.wikipedia.org/wiki/Python_%28programming_language%29 module SMBus http://www.acmesystems.it/i2c,Raspberry Pi 可以与 Rainbowduino 通信,但在尝试该命令时,我经常收到输入/输出错误消息bus.write_i2c_block_data(address, signal, data)
.
It says:
IOError: [Errno 5] 输入/输出错误
为什么会发生这种情况以及如何修复或忽略这些错误?
长话短说,很多人都被这个问题困扰,我发现一个非常简单的解决方法如下。
它会让你忽略错误并保持 tx/rx-ing,调用 i2cdetect 似乎会以某种方式重新初始化总线,而不是 arduino 从中消失。
我在这里发布了如何找到此解决方案的解释(现在正在等待 mod 批准)
try:
bus.write_i2c_block_data(address, signal, data)
except IOError:
subprocess.call(['i2cdetect', '-y', '1'])
flag = 1 #optional flag to signal your code to resend or something
即使这允许 Pi 继续传输坏数据,仍然会发送到 arduino。我发现解决这个问题的最简单方法是在数据块的末尾添加一个额外的校验和字节。
我将消息的每个字节添加到一个字节变量中,允许值翻转,然后为校验和字节分配将整个消息求和为零所需的任何值。
然后,arduino 可以通过对所有字节求和来检查每个传入的传输。如果消息的总和不为零,则将其视为错误传输而被忽略。
我还为我的消息分配了一个单字节消息 ID,该 ID 在每次成功传输后都会递增,从而消除了意外重复发送的可能性。但这可能并不是真正必要的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)