使用Python模块的SMBus,一个树莓Pi和一个Arduino输入/输出错误(Input/out

2019-08-17 08:43发布

我已经连接一个树莓裨和Rainbowduino用自制一起I²C电平移位器,并安装了的Python模块的SMBus ,树莓裨可以与Rainbowduino通信,但每隔一段时间我试图命令时获得的输入/输出错误消息bus.write_i2c_block_data(address, signal, data)

它说:

IO错误:[错误5]输入/输出错误

它为什么会发生,如何解决或忽略这些错误?

Answer 1:

人长话短说很多受此困扰,我发现了一个很简单的解决办法如下。

它可以让你忽略错误并保持TX / RX-ING,呼吁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

尽管这让曹丕保持发送错误的数据仍被发送到Arduino。 我发现来解决这个问题,最简单的方法是一个额外的校验和字节添加到我的数据块的结束。

我添加了消息的每个字节一个字节变量允许值以内侧翻,然后分配检验和字节的任何必要的值总结整个消息减小到零。

然后Arduino的可由所有字节相加检查每个输入传输。 如果该消息不总结出到零,它被忽略作为错误传输。

我还分配我的消息,其中每个成功传输之后递增一个字节的消息ID,消除意外双发送的可能性。 但事实可能并非真的是必要的。



Answer 2:

我创建一个嗡嗡服务器与树莓派和Arduino的UNO与I2C和遇到同样的问题。 我的设计是,当将Pi从插座(在网络上由某些外部机器)接收到连接请求时,将其写入“1”到Arduino和Arduino的将使循环环路()通过改变全局变量。 在写操作之后皮会不断地从Arduino的读取字节检查按钮状态。 当PI想要停止阅读它发送“0”停止循环并重置所有计数器和LED。

什么情况是,写字节时,Python将通过IO错误随机。 与Arduino的串口监视器,我注意到接收到的数据是1,而不是0,这是什么PI应该发送。 在观看i2cdetect -y 1我发现地址是错误的,我试过Jon的方法,但作为user3126397提到的,坏数据已发送和Arduino的已停止。 我尝试了modprobe的,只有抑制错误消息和Arduino是仍处于停止状态。

我原本猜想,因为不完整的读/写的变味的数据,因此增加了Serial.println()来检查的onReceive参数BYTECOUNT()。 在不改变其他任何代码,我观察到没有。 IO错误之前的成功操作增加了不少。 因此,我试图添加更多的println()来测试的相关性,发现在故障急剧增加。 最后,我评论的所有串行语句和我最终能够使用该服务器没有缺点了相当多的时间(我测试过类似的30倍,仍然没有IO错误)。

我怀疑,关于user3126397对重置波特率和我对Serial.println()关系观察的解决方案,该错误确实是由PI和Arduino的之间的同步问题引起的(如串行相对缓慢,而导致在节目中更延迟,从而增加失败的机会。



Answer 3:

根据您的RPI,您可以使用bus = SMBus(0)bus = SMBus(1)初始化SMBus的。

我希望这能解决你的问题。



Answer 4:

我写了这20小时前,当我以为我已经为IO错误问题的修正:................................ .............................................

使用bus.write_byte交谈一个Arduino的时候我一直在困扰着相同的输入/输出错误。 我想Jon的i2cdetect修复,但发现,此时已经造成的损害的代码,糟糕的数字已经得到了到Arduino并以某种方式禁用它。

做什么工作复位I2C波特率,采用

    sudo modprobe -r i2c_bcm2708
    sudo modprobe i2c_bcm2708 baudrate=100010

在此之后没有更多的I / O错误! 我会在理论什么可能会导致这种明显不匹配的波特率非常感兴趣。 希望这可以帮助!

.................................................. ...............................

之后好了很多更多的测试,我发现是,波特率修复的确让错误率下降,但并没有消除它们。

现在看来很清楚,乔恩的i2cdetect呼叫应用之后的错误将初始化RPI,这样才能继续进行。 但你也不得不面对一个事实,即不良数据可能发送到Arduino,你需要进行检测,并修复它,并重新初始化线(在我的情况下,伺服驱动器),因此,即使丕得到一个错误,该数据将继续打通可用。 希望这可以帮助。



Answer 5:

我最近遇到同样的问题来了。 当我禁用了teensy的串行接口,这些错误完全消失。

我使用的RPI 2与teensy 3.2在2.4MHz的通过I2C通信中,在约38 Kbps的速率发送33字节的有效载荷。



文章来源: Input/output error using Python module SMBus, a Raspberry Pi and an Arduino