python - 使用 Python 模块 SMBus、Raspberry Pi 和 Arduino 时出现输入/输出错误

标签 python arduino raspberry-pi

我已经连接了一个 Raspberry PiRainbowduino连同自制I²C电平转换器,并安装了 Python模块 SMBus , Raspberry Pi 可以与 Rainbowduino 通信,但在尝试命令 bus.write_i2c_block_data(address, signal, data) 时,我经常会收到输入/输出错误消息。

它说:

IOError: [Errno 5] Input/output error

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

最佳答案

长话短说很多人都被这个困扰,我发现一个非常简单的解决方法如下。

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

我在这里发布了我如何找到这个解决方案的解释(现在正在等待 mod 批准) 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。我发现解决这个问题的最简单方法是在我的数据 block 末尾添加一个额外的校验和字节。

我将消息的每个字节加到一个允许值翻转的字节变量中,然后为校验和字节分配任何必要的值,以使整个消息总和为零。

然后 arduino 可以通过对所有字节求和来检查每个传入的传输。如果消息的总和不为零,则将其视为错误传输而被忽略。

我还为我的消息分配了一个单字节的消息 ID,该 ID 在每次成功传输后递增,从而消除了意外重复发送的可能性。但这可能真的没有必要。

关于python - 使用 Python 模块 SMBus、Raspberry Pi 和 Arduino 时出现输入/输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15245235/

相关文章:

使用init.d运行的Python程序不写入数据

php - 用于长时间运行作业的 PHP Cron Job 的替代方案

python - RFM69 radio 收发器 : Arduino is not registering acknowledgement for transmission sent by Raspberry Pi

java - 从 Java 服务器发送数据到 ESP8266

json - Web 服务 C# JSON 到 Arduino

audio - 用于在两个树莓派之间流式传输多路复用 h.264 和 aac 音频的 gstreamer 管道

python - Raspberry Pi - Python 中的 GPIO 事件

python - 导入包本质上需要 __init__.py

Python 循环查询 MySQL - 查询结果未更新?

python - 这些 Python 结构之间的区别