尝试通过 I2C 从 Arduino 获取数据时,出现 IOError:[Errno 121] python(树莓派)上的 smbus 远程 I/O 错误

2023-11-21

我遇到了问题,在启动通过 I2C 从 Arduino 请求数据的脚本时,python 有时会在我的 raspberry pi 3 上抛出这个 IOError 。

电气连接是完美的,所以这不是问题。 此外,我在使用 i2cget -y 1 0x04 时也没有收到任何错误

只有 python 脚本有时很糟糕,我不知道为什么。

这是我的 Arduino 代码:

我注册了一个 onReceive 和一个 onRequestEvent。 onReceive 回调将定义应该发送回树莓派的数据类型。 onRequest 回调执行响应。

    #include <CommonFunction.h>
#include <Wire.h>

#define I2C_ADDRESS 0x4

commonFunc GetCountsEverySecond;
int g_iOnRequestActionCode = 0;
unsigned long g_lSecondsSinceStart = 0;

void setup() 
{
    Wire.begin(I2C_ADDRESS);
    Wire.onRequest(sendDataOverI2CGateway);
    Wire.onReceive(defineOnRequestAction);
}


void loop() 
{
    tickSeconds();
}

void tickSeconds()
{
    if (GetCountsEverySecond.TimeTriggerAt(1000))
    {
        g_lSecondsSinceStart++;
    }
}

void sendOperationTimeDataOverI2C()
{
    unsigned long longInt = g_lSecondsSinceStart;
    byte size = sizeof(longInt);

    byte arr[size];
    for (int i = 0; i < size; i++)
    {
        int iBitShift = 8 * (size - i - 1);
        if (iBitShift >= 8)
            arr[i] = ((longInt >> iBitShift) & 0xFF);
        else
            arr[i] = (longInt & 0xFF);
    }
    Wire.write(arr, size);
    g_bI2CSending = true;
}

void sendDataOverI2CGateway()
{
    switch(g_iOnRequestActionCode)
    {
        case 0:
            sendRainDataOverI2C();
            break;
        case 1: // send firmware version
            sendVersionDataOverI2C();
            break;
        case 2: // send operation time of arduino in seconds from start
            sendOperationTimeDataOverI2C();
            break;
        default: break;
    }
}

void defineOnRequestAction(int iBuffer) 
{
    while (Wire.available())
    {
        g_iOnRequestActionCode = Wire.read();
    }
}

这是我的 python 代码。 非常简单,但它会引起一些头痛。

import smbus
import time
bus = smbus.SMBus(1)
while True:
        data = bus.read_i2c_block_data(0x04,0x02,4)
        result = 0
        for b in data:
                result = result * 256 + int(b)
        print(result)
        time.sleep(1)

执行我的 python 脚本后,有时会出现此错误:

pi@WeatherStation:~/workspace $ sudo python readTimeOperationData.py
Traceback (most recent call last):
  File "readTimeOperationData.py", line 5, in <module>
    data = bus.read_i2c_block_data(0x04,0x02,4)
IOError: [Errno 121] Remote I/O error

谁能帮我解决这个问题?

干杯迪特


我解决了!!

我从这篇文章中得到了提示:https://www.raspberrypi.org/forums/viewtopic.php?t=203286

通过在之后添加延迟bus = smbus.SMBus(1)解决了这个问题。 似乎需要一段短暂的延迟才能使 I2C 稳定下来。

工作代码通过调用脚本 100 次进行测试,没有出现任何问题。

import smbus
import time
bus = smbus.SMBus(1)
time.sleep(1) #wait here to avoid 121 IO Error
while True:
    data = bus.read_i2c_block_data(0x04,0x02,4)
    result = 0
    for b in data:
        result = result * 256 + int(b)
    print(result)
    time.sleep(1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试通过 I2C 从 Arduino 获取数据时,出现 IOError:[Errno 121] python(树莓派)上的 smbus 远程 I/O 错误 的相关文章

  • 将 pandas 数据框中的列减去其第一个值

    我需要将 pandas 数据帧的一列中的所有元素减去其第一个值 在这段代码中 pandas 抱怨 self inferred type 我猜这是循环引用 df Time df Time df Time 0 在这段代码中 pandas 抱怨为
  • 如何屏蔽 PyTorch 权重参数中的权重?

    我正在尝试在 PyTorch 中屏蔽 强制为零 特定权重值 我试图掩盖的权重是这样定义的def init class LSTM MASK nn Module def init self options inp dim super LSTM
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 使用 Django 的 post_save() 信号

    我有两张桌子 class Advertisement models Model created at models DateTimeField auto now add True author email models EmailField
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • Sorted(key=lambda: ...) 背后的语法[重复]

    这个问题在这里已经有答案了 我不太明白背后的语法sorted 争论 key lambda variable variable 0 Isn t lambda随意的 为什么是variable在看起来像的内容中陈述了两次dict 我认为这里的所有
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • Python3 查找 2 个列表中有多少个差异才能相等

    假设我们有 2 个列表 always具有相同的长度和always包含字符串 list1 sot sot ts gg gg gg list2 gg gg gg gg gg sot 我们需要找到 其中有多少项list2应该改变 以便它等于lis
  • 如何为多组精灵创建随机位置?

    我尝试使用 blit 和 draw 方法进行 for 循环 并为 PlayerSprite 和 Treegroup 使用不同的变量 for PlayerSprite in Treegroup surface blit PlayerSprit
  • 我可以使用 dask 创建 multivariate_normal 矩阵吗?

    有点相关这个帖子 https stackoverflow com questions 52337612 random multivariate normal on a dask array 我正在尝试复制multivariate norma
  • 使用循环将对象添加到列表(python)

    我正在尝试使用 while 循环将对象添加到列表中 基本上这就是我想做的 class x pass choice raw input pick what you want to do while choice 0 if choice 1 E
  • Python int 太大,无法放入 SQLite

    我收到错误 OverflowError Python int 太大 无法转换为 SQLite INTEGER 来自以下代码块 该文件约25GB 因此必须分部分读取 length 6128765 Works on partitions of
  • 负整数的Python表示

    gt gt gt x 4 gt gt gt print b format x x 4 100 gt gt gt mask 0xFFFFFFFF gt gt gt print b format x mask x mask 4294967292
  • Python Flask 是否定义了路由顺序?

    在我看来 我的设置类似于以下内容 app route test def test app route
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • asyncio - 多次等待协程(周期性任务)

    我正在尝试为异步事件循环创建定期任务 如下所示 但是我收到 RuntimeError 无法重用已等待的协程 异常 显然 asyncio 不允许等待相同的可等待函数 如中讨论的这个错误线程 https bugs python org issu
  • Google App Engine 中的自定义身份验证

    有谁知道或知道我可以在哪里学习如何使用 Python 和 Google App Engine 创建自定义身份验证流程 我不想使用 Google 帐户进行身份验证 并且希望能够创建自己的用户 如果不是专门针对 Google App Engin
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30

随机推荐

  • C 和 C++ 执行时间的差异

    我最近发现了这个名为 codechef 的网站 您可以在其中提交问题的解决方案 我为一个问题提交了两个答案 一个用 C 语言 另一个用 C 语言 两个代码几乎相同 但是当我用C提交的代码在4 89s执行时 我用C 提交的代码超时了 超过8秒
  • 创建文件 获取文件时间 设置文件时间

    我在使用 GetFileTime 和 SetFileTime 时遇到问题 当涉及到目录时 具体来说我认为我的问题是 我是 WinAPI 的新手 我认为我没有得到 正确处理 有两种情况 首先 我只需要一个句柄来获取文件或目录 时间戳 创建 访
  • 类型错误:格式字符串参数不足 - 使用 %Y-%m 时 Python SQL 连接

    with engine connect as con rs con execute SELECT datediff STR TO DATE CONCAT year month day Y m d current date from TABL
  • .setVisible(true) 立即重绘

    在一个简短的方法中 我使用 setVisible false 隐藏 JFrame 然后我截取屏幕截图并使用 setVisible true 恢复 JFrame 再次可见后 窗口应该显示与之前不同的图片 假设截取的屏幕截图的一部分 问题是 在
  • 如何从命令行使用 MSBuild 构建所有内容?

    这是有效的吗 MSBuild t all configuration all 我想使用 Visual Studio 2008 中的 MSBuild 从命令行构建 sln 文件等中所有项目的所有配置 我不想在调用 MSBuild 时指定它们
  • 如何在 cypress 测试中公开/访问 Redux 等数据存储?

    The 赛普拉斯文档说你可以 公开数据存储 如 Redux 中 以便您可以直接从测试代码以编程方式更改应用程序的状态 我还观看了 Kent C Dodds 先生的测试课程 他提到可以使用 Cypress 中的现有数据来初始化 redux 存
  • C++ 中的并行赋值

    有没有办法在C 中进行并行赋值 目前 以下编译 带有警告 include
  • 设置文本字段的禁用背景颜色

    I have a textfield which I set seteditable false and setEnabled false but the problem is that in this case the backgroun
  • 如何实现rabbitMQ的单消费者多队列模型

    我发现这张图片与我的商业模式非常相似 我需要将消息拆分到某个队列 进行一些繁重的工作 我可以为他们添加更多的工作线程 但对于一些人来说 没有太多繁重的工作 我可以 让单个消费者订阅他们的消息 但是在rabbitMQ 中如何做到这一点呢 通过
  • Rails 3 中具有数组格式的 find_by_sql

    美好的一天伙计们 我在用着find by sql 在 Rails 3 中按如下方式获取记录 list Email find by sql SELECT FROM Emails WHERE sent id params id 如果多个参数适用
  • SwiftUI如何调整不同的屏幕尺寸

    我正在使用 SwiftUI 开发人员列表页面 iPhone X 屏幕足够大 但标题在 iPhone 8 中超出屏幕 iPhone X 然而 在 iPhone 8 或更小的屏幕中 查找人员 太靠近左侧 全部关注 甚至超出了屏幕 我知道在 UI
  • 如何在 python 中规范化二维 numpy 数组而不那么冗长?

    给定一个 3 乘以 3 的 numpy 数组 a numpy arange 0 27 3 reshape 3 3 array 0 3 6 9 12 15 18 21 24 为了标准化我想到的二维数组的行 row sums a sum axi
  • 将 Ninject 与 Udi Dahan 的领域事件结合使用

    我在 MVC 项目中使用 Ninject 并尝试按照 Udi Dahan 的模式实现领域事件http www udidahan com 2009 06 14 domain events salvation 在下面的摘录中 容器 用于解析已引
  • sqlite 数据库表在测试时被锁定

    我正在尝试将应用程序从 django 1 11 1 迁移到 django 2 0 1 测试设置为在内存数据库中使用 sqlite 运行 但每次测试都失败了 因为sqlite3 OperationalError database table
  • git 忽略异常

    我有一个 gitignore 文件 它使 git 忽略 dll文件 这实际上是我想要的行为 但是 如果我想要一个例外 即能够提交foo dll 我怎样才能做到这一点 Use dll Exclude all dlls foo dll Exce
  • 如何从左上到右填充 QGridLayout?

    我想填写一个QGridLayout with QWidgets The QWidgets需要以从左上到右上的方式出现 并在每行填充后继续向下填充QWidgets 类似且熟悉的 GUI 的一个例子是 Apple 如何在 iPhone 或 iP
  • 使用 XPath 查询从匹配的 XML 节点获取属性值

    这看起来并不困难 但我目前陷入困境 我正在尝试从与给定 XPath 查询字符串匹配的节点获取特定属性的属性值 这是我到目前为止所拥有的 public static IEnumerable
  • 如何在java中创建任意深度的嵌套数组?

    我正在尝试创建一个由数组的数组组成的数组等 但我不知道在运行时之前需要多少嵌套级别 根据输入 我可能需要int int int 或其他任何东西 对于上下文 我正在尝试构建一个N维网格对于元胞自动机 其中 N 作为参数传递 我没有任何代码给你
  • Maven“无法解析错误消息”(Java 7 + Maven 2)

    我有一个基于 Maven 的 GWT 项目 其中包括 Guava 我在 Maven 尝试 但失败 编译它在中找到的源代码时遇到了麻烦guava gwt jar could not parse error message symbol sta
  • 尝试通过 I2C 从 Arduino 获取数据时,出现 IOError:[Errno 121] python(树莓派)上的 smbus 远程 I/O 错误

    我遇到了问题 在启动通过 I2C 从 Arduino 请求数据的脚本时 python 有时会在我的 raspberry pi 3 上抛出这个 IOError 电气连接是完美的 所以这不是问题 此外 我在使用 i2cget y 1 0x04