'IOError:[Errno 5]输入/输出错误',同时使用SMBus通过RPi进行模拟读取

时间:2015-05-19 12:14:49

标签: python python-2.7 raspberry-pi analog-digital-converter

我一直在寻找标题中提到的错误的答案,但这是我第一次得到答案。我试图让我的Raspberry pi读取模拟数据,但是当我在终端窗口中运行代码时,它给出了'IOError:[Errno 5]输入/输出错误'。

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

我理解这可能是因为raspberry 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

感谢任何帮助。这是我试图执行的更大项目中的基本块。因此,我可以更好地工作,我可以构建我的应用程序。 谢谢

10 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:4)

虽然这个帖子已经老了,但我想分享我的意见,希望别人可能会得到帮助,因为我遇到的所有帖子都没有提到这个潜在的解决方案。

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

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

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

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

答案 2 :(得分:3)

这些错误可能超出程序员的控制范围,这是由随机但通常的事件引起的。

一种方法是在跟踪错误之前尝试几次:

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))

答案 3 :(得分:2)

造成这种情况的原因可能是您要快速推出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(应该通过包管理提供,除非您使用自定义软件分发)以检查设备是否实际可用(有时它可能是接线问题就像遗忘的GND):

i2cdetect -y [bus number]

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

答案 4 :(得分:1)

使用模型b + rpi在I2C上驱动7-segment serial display时遇到此问题。我通过调整波特率来匹配设备设置(9600)来纠正问题。我相信默认值是100000。

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

options i2c_bcm2708 baudrate=9600

重新启动后,我确认该设置已生效:

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

从那以后,我对间歇性I / O错误没有任何问题。

答案 5 :(得分:1)

我在远程(从服务器)读取大容量 csv 文件时遇到了类似的问题,我正在远程连接到工作站,我试图从服务器读取大容量 csv 文件。我将文件复制到工作站,因此解决了“IOError:[Errno 5] 输入/输出错误”。之后我遇到了 MemoryError,我通过块读取解决了它,然后通过 pd.concat 转换为数据帧。

代码如下:

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

DF_CSV=pd.concat(chunk)

答案 6 :(得分:0)

我在RasPi中遇到了同样的问题 - &gt; ATMEGA通信,我在奴隶上解决它。如果您的从服务器没有响应,则会出现此错误消息。

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

来自smbus导入SMBus

I2C_Bus = SMBus(1)

SLAVE_ADD = 0x8

I2C_Bus.write_byte(SLAVE_ADD,0xAA)

提供I2C从设备已经配置好确认,它应该工作!

答案 7 :(得分:0)

我知道这个话题很老但是当我把值放在范围内时,I2C和PCA9685也会出现同样的错误。我想出来的方法只是简单地禁用和启用I2C:

  1. sudo raspi-config
  2. '5。接口选项'
  3. 'P5 I2C'
  4. '否'
  5. 'OK'
  6. sudo reboot now
  7. sudo raspi-config
  8. '5。接口选项'
  9. 'P5 I2C'
  10. '是'
  11. 'OK'
  12. sudo reboot now
  13. 之后,sudo i2cdetect -y 1再次检测到我的I2C PWM模块。

答案 8 :(得分:0)

这个问题很老,但是据我说很实际!

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

gpio mode 8 alt0
gpio mode 9 alt0

8和9,因为这是wirepi用于物理针脚3和5的编号。 这就是问题所在...它使用了connectionpi。
http://wiringpi.com/wiringpi-deprecated/

在我的python代码中,我可以创建对这2个命令的系统调用(对我而言,它可以工作!)

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

有人吗?

答案 9 :(得分:0)

就我而言,有导致此问题的打印声明,我只是删除了该打印声明,现在该问题已为我解决。