18

我一直在寻找标题中提到的错误的答案,但我还是第一次得到答案。我们将尝试让我的 Raspberry pi 读取模拟数据,但是当我在终端窗口中运行代码时,它给了我“IOError:[Errno 5] Input/output error”。

我用来读取模拟数据的代码如下所示。我使用 PCF8591 ADC 转换器。

from smbus import SMBus

bus = SMBus(0)

print "read a/d press ctrl + c to stop"

bus.write_byte(0x48, 0)
lastval = -1

while True:
  reada = bus.read_byte(0x48)
  if(abs(lastval-reada) > 2):
    print(reada)
    lastval=reada

我知道这可能是因为树莓派中的版本发生了变化,我应该将 SMBus(0) 更改为 SMBus(1)。为此,我检查了我的 RPi 版本,它不是修订版。但是我仍然尝试通过更改 SMBus 号码来运行该程序,但仍然没有运气。

我得到的错误如下所示:

Traceback (most recent call last):
  File "analogread.py", line 7, in <module>
    bus.write_byte(0x48, 0)
IOError: [Errno 5] Input/output error

任何帮助表示赞赏。这是我试图执行的更大项目中的基本块。所以,我越瘦,我就越能构建我的应用程序。谢谢

4

10 回答 10

20

造成这种情况的原因可能是您正在远程工作 (SSH)。断开远程会话后,您的程序仍在工作,并且可以尝试打印或与控制台交互,这不再可用。这就是发生在我身上的事情。

于 2016-05-03T07:04:07.080 回答
6

虽然这个帖子很旧,但我想分享我的想法,希望其他人可以得到帮助,因为我遇到的所有帖子都没有提到这个潜在的修复。

我遇到了类似的问题,但硬件不同(MCP23017 和 LCD)。

追了一段时间后,我发现问题不是软件,而是硬件。特别是 SCL 和 SDA 线上的上拉电阻。

RPI(在我的例子中是 3 个)有 1.8k 电阻,我的 LCD 也安装了一些上拉电阻(~2.2k)。运行 LCD 从来没有问题,但 MCP23017 会随机从总线上消失,并在通过发出命令“i2cdetect -y 1”运行扫描时重新出现。

移除 LCD 上的额外上拉电阻解决了问题,现在一切正常。

于 2016-07-30T23:47:11.553 回答
5

造成这种情况的原因可能是您发出read/write呼叫的速度超过了硬件可以接受的速度。所以在读/写操作之间添加小的延迟:

from time import sleep
from smbus import SMBus

bus = SMBus(0)

bus.write_byte(0x48, 0)
sleep(0.2)  # Wait for device to actually settle down
lastval = -1

while True:
  reada = bus.read_byte(0x48)
  if(abs(lastval-reada) > 2):
    print(reada)
    lastval=reada
  sleep(0.2) # This might be not needed.

另一种可能性是设备实际上并不存在于该地址中。因此,如果超时没有帮助,请尝试 i2c-tools(应该通过包管理提供,除非您使用自定义软件分发)来检查设备是否实际可用(有时可能是接线问题,例如忘记接地):

i2cdetect -y [bus number]

为什么选择 i2c?因为 SMBus 基本上是对 i2c 总线的修改,具有更严格定义的电压电平和时序。

于 2015-06-04T07:53:51.410 回答
4

These errors might be beyond programmer's control, caused by a random, yet usual, event.

One approach would be to try a couple of times before following with the error:

def try_io(call, tries=10):
    assert tries > 0
    error = None
    result = None

    while tries:
        try:
            result = call()
        except IOError as e:
            error = e
            tries -= 1
        else:
            break

    if not tries:
        raise error

    return result

try_io(lambda: bus.write_byte(0x48, 0))
于 2015-06-03T20:46:54.603 回答
2

我知道这个话题已经很老了,但是当我输入不在范围内的值时,I2C 和 PCA9685 也发生了同样的错误。我想出来的方法只是简单地禁用和启用 I2C:

  1. sudo raspi-config
  2. '5。接口选项'
  3. 'P5 I2C'
  4. '不'
  5. '好的'
  6. sudo reboot now
  7. sudo raspi-config
  8. '5。接口选项'
  9. 'P5 I2C'
  10. '是的'
  11. '好的'
  12. sudo reboot now

之后,sudo i2cdetect -y 1再次检测到我的 I2C PWM 模块。

于 2017-08-25T09:41:59.447 回答
2

我在使用型号 b+ rpi 通过 I2C驱动7 段串行显示器时遇到了这个问题。我通过调整波特率以匹配设备设置(9600)纠正了这个问题。我相信默认值是 100000。

为了更改波特率,我在 /etc/modprobe.d/i2c.conf 中添加了以下行:

options i2c_bcm2708 baudrate=9600

重新启动后,我验证设置已生效:

prompt$ sudo cat /sys/module/i2c_bcm2708/parameters/baudrate
9600

从那时起,我就没有遇到过间歇性 I/O 错误的问题。

于 2017-06-21T21:44:18.723 回答
1

我在远程(从服务器)读取大容量 csv 文件时遇到了类似的问题,我正在远程连接到工作站并且我试图从服务器读取大容量 csv 文件。我将文件复制到工作站,因此“IOError:[Errno 5] Input/output error”得到了解决。我有一个 MemoryError 之后我通过块读取解决了它,然后通过pd.concat.

代码如下:

chunk=pd.read_csv(CSV_File_Loc,chunksize=1000000,low_memory=False)

DF_CSV=pd.concat(chunk)
于 2021-04-12T23:04:30.043 回答
0

就我而言,有导致此问题的打印语句,我刚刚删除了该打印语句,现在该问题已为我解决。

于 2020-04-21T05:24:22.527 回答
0

这个问题很老,但根据我的说法非常实际!

解决方案(对于 RPi 3B+)是在引脚 3 和 5(物理)处为 GPIO 设置 ALT0 模式。这可以使用 gpio 命令行工具来完成:

gpio mode 8 alt0
gpio mode 9 alt0

8和9,因为这些是wiringpi用于物理引脚3和5的编号。这正是问题所在……它使用wiringpi。
http://wiringpi.com/wiringpi-deprecated/

在我的 python 代码中,我可以创建对这两个命令的系统调用(对我来说它有效!)

但是,我想要一个不使用已弃用的库或工具的解决方案。

任何人?

于 2019-11-20T00:30:29.450 回答
0

我在 RasPi -> ATMEGA 通信中遇到了同样的问题,我在从站上解决了它。如果您的从站没有响应,则会出现此错误消息。

我在 RasPi 上尝试了以下代码,I2C 从机连接在 I2C 总线上并配置了 0x8 地址:

从 smbus 导入 SMBus

I2C_Bus = SMBus(1)

SLAVE_ADD = 0x8

I2C_Bus.write_byte(SLAVE_ADD, 0xAA)

如果 I2C 从机配置良好,可以确认,它应该可以工作!

于 2015-09-17T12:33:33.520 回答