我一直在寻找标题中提到的错误的答案,但这是我第一次得到答案。我试图让我的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
感谢任何帮助。这是我试图执行的更大项目中的基本块。因此,我可以更好地工作,我可以构建我的应用程序。 谢谢
答案 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地址:
I2C_Bus = SMBus(1)
SLAVE_ADD = 0x8
I2C_Bus.write_byte(SLAVE_ADD,0xAA)
提供I2C从设备已经配置好确认,它应该工作!
答案 7 :(得分:0)
我知道这个话题很老但是当我把值放在范围内时,I2C和PCA9685也会出现同样的错误。我想出来的方法只是简单地禁用和启用I2C:
sudo raspi-config
sudo reboot now
sudo raspi-config
sudo reboot now
之后,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)
就我而言,有导致此问题的打印声明,我只是删除了该打印声明,现在该问题已为我解决。