“IOError:[Errno 5]Input/output error”,当使用SMBus通过RPi进行模拟读取时

2024-05-20 21:37:05 发布

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

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

用于读取模拟数据的代码im如下所示。Im使用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

我知道这可能是因为覆盆子pi中的版本更改了,我应该将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

如有任何帮助,我们将不胜感激。这是我试图执行的更大项目中的基本模块。所以,越快,我得到的东西工作越好,我可以建立我的应用程序。 谢谢你


Tags: 数据答案代码inputoutput错误pierror
3条回答

原因可能是您正在远程工作(SSH)。 断开远程会话后,程序仍在工作,可以尝试打印或与控制台交互,控制台不再可用。这就是我的遭遇。

虽然这个线程是旧的,我想分享我的结果,希望其他人可能会得到帮助,因为我遇到的所有帖子都没有提到这个潜在的修复。

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

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

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

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

这可能是因为您的硬件无法接受这些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工具(应该可以通过包管理获得,除非您使用自定义软件分发)来检查设备是否实际可用(有时可能是布线问题,如忘记GND):

i2cdetect -y [bus number]

为什么是i2c?因为SMBus基本上是对i2c总线的一种改进,具有更严格的电压等级和定时。

相关问题 更多 >