使用Python模块SMBus、覆盆子Pi和Arduin的输入/输出错误

2024-05-20 20:59:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经连接了Raspberry PiRainbowduino以及自制的I²C电平移位器,并安装了Python模块SMBus,覆盆子Pi可以与彩虹duino通信,但在尝试命令bus.write_i2c_block_data(address, signal, data)时,经常会收到输入/输出错误消息。

上面写着:

IOError: [Errno 5] Input/output error

为什么会发生这种情况,我如何修复或忽略这些错误?


Tags: 模块命令data覆盆子错误pii2craspberry
2条回答

长话短说很多人都被这个困扰着,我发现一个很简单的工作就是围绕着下面。

它将让您忽略错误并保持tx/rx工作,调用i2cdetect似乎以某种方式重新初始化总线,而不是arduino从中消失。

我在这里发布了我如何找到这个解决方案的解释(正在等待国防部的批准) http://www.raspberrypi.org/phpBB3/viewtopic.php?f=41&t=52517

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都会递增,从而消除了意外的双重发送的可能性。但这并不是必须的。

我正在创建一个带有覆盆子Pi和Arduino UNO i2c的buzzing服务器,遇到了同样的问题。我的设计是,当Pi从套接字(由网络上的一些外部机器)接收到连接请求时,它会将“1”写入Arduino,Arduino将通过更改全局变量启用loop in loop()。写入后,Pi将连续从Arduino读取字节,以检查按钮状态。当Pi想要停止读取时,它发送“0”来停止循环并重置所有计数器和LED。

结果是Python在写入字节时会随机通过IOError。在带有Arduino的串行监视器上,我注意到接收到的最后一个字节是1,而不是0,这是pi应该发送的。在查看i2cdetect-y 1时,我注意到地址是错误的,我尝试了Jon的方法,但是正如user3126397所提到的,坏数据已经发送,Arduino已经停止。我尝试了他的modprobe,但它只抑制了错误消息,而Arduino仍处于停止状态。

我最初怀疑数据因为不完整的读/写而变酸,因此添加了一个Serial.println()来检查onReceive()中的参数byteCount。在没有修改任何其他代码的情况下,我发现IOError之前成功操作的次数增加了很多。因此,我尝试添加更多println()来测试相关性,并注意到失败率急剧增加。最后,我评论了所有的串行语句,我最终能够在相当长的时间内无故障地使用服务器(我测试了大约30次,仍然没有IOError)。

我怀疑,关于用户3126397重置波特率的解决方案和我对Serial.println()关系的观察,这个错误确实是由pi和Arduino之间的同步问题引起的(因为Serial相对较慢,导致程序延迟更多,因此增加了失败的机会)。

相关问题 更多 >