Ich habe nach der Antwort für den im Titel genannten Fehler gesucht, aber zum ersten Mal habe ich noch keine Antwort erhalten. Wir werden versuchen, meinen Raspberry Pi dazu zu bringen, analoge Daten zu lesen, aber wenn ich den Code im Terminal-Fenster starte, bekomme ich 'IOError: [Errno 5] Input/output error'.
Der Code zum Lesen analoger Daten ist unten dargestellt. Ich verwende den ADC-Konverter PCF8591.
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
Ich verstehe, dass es an der in Raspberry Pi geänderten Version liegen könnte, und ich sollte SMBus (0) in SMBus (1) ändern. Dafür habe ich meine RPi-Version überprüft, die nicht die überarbeitete ist. Trotzdem habe ich versucht, das Programm auszuführen, indem ich die SMBus-Nummer geändert habe.
Der Fehler, den ich erhalte, wird unten angezeigt:
Traceback (most recent call last):
File "analogread.py", line 7, in <module>
bus.write_byte(0x48, 0)
IOError: [Errno 5] Input/output error
Jede Hilfe wird geschätzt. Dies ist der grundlegende Block in meinem größeren Projekt, das ich ausführen möchte. Also, der fas thinster, den ich sache bekomme, desto besser kann ich meine Anwendung erstellen
Der Grund dafür könnte sein, dass Sie remote arbeiten (SSH). Nachdem Sie die Remote-Sitzung getrennt haben, funktioniert Ihr Programm immer noch und versucht möglicherweise zu drucken oder mit der Konsole zu interagieren. Das ist mir passiert.
Diese Fehler könnten außerhalb der Kontrolle des Programmierers liegen, verursacht durch ein zufälliges, aber gewöhnliches Ereignis.
Ein Ansatz wäre es, ein paar Mal vor dem folgenden Fehler zu versuchen:
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))
Während dieser Thread alt ist, möchte ich meine Resuly teilen, in der Hoffnung, dass jemand anderem geholfen werden könnte, da alle Beiträge, auf die ich gestoßen bin, diese mögliche Lösung nicht erwähnt haben.
Ich hatte ein ähnliches Problem, jedoch mit anderer Hardware (MCP23017 und LCD).
Nachdem ich das Problem einige Zeit verfolgt hatte, stellte ich fest, dass es sich nicht um Software, sondern um Hardware handelte. Insbesondere die Pull-Up-Widerstände auf den SCL- und SDA-Leitungen.
Das RPI (in meinem Fall 3) hat 1,8-k-Widerstände, und bei LCD wurden einige Pull-Up-Widerstände installiert (~ 2,2 k). Beim Ausführen des LCD war nie ein Problem aufgetreten, aber der MCP23017 verschwand zufällig aus dem Bus und wurde beim Ausführen eines Scans mit dem Befehl "i2cdetect -y 1" erneut angezeigt.
Durch das Entfernen der zusätzlichen Pull-Up-Widerstände am LCD wurde das Problem behoben und alles funktioniert jetzt einwandfrei.
Der Grund dafür könnte darin liegen, dass Sie die read/write
-Aufrufe schneller durchstoßen, als von Ihrer Hardware angenommen werden können. Fügen Sie also kleine Verzögerungen zwischen Lese- und Schreibvorgängen hinzu:
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.
Eine andere Möglichkeit ist, dass das Gerät in dieser Adresse nicht vorhanden ist. Wenn die Zeitüberschreitungen nicht helfen, sollten Sie die i2c-Tools ausprobieren (sollte über die Paketverwaltung verfügbar sein, es sei denn, Sie verwenden eine angepasste Softwareverteilung), um zu prüfen, ob das Gerät tatsächlich verfügbar ist GND):
i2cdetect -y [bus number]
Warum i2c? Der SMBus ist im Grunde eine Modifikation des i2c-Busses mit strengeren Spannungspegeln und Timings.
Dieses Problem trat auf, wenn eine serielle 7-Segmentanzeige über I2C mit einem Modell b + rpi gefahren wurde. Ich habe das Problem behoben, indem ich die Baudrate an die Geräteeinstellung (9600) angepasst habe. Ich glaube, der Standardwert ist 100000.
Um die Baudrate zu ändern, habe ich /etc/modprobe.d/i2c.conf die folgende Zeile hinzugefügt:
options i2c_bcm2708 baudrate=9600
Nach dem Neustart habe ich überprüft, dass die Einstellung wirksam wurde mit:
Prompt$ Sudo cat /sys/module/i2c_bcm2708/parameters/baudrate
9600
Ich habe seitdem keine Probleme mit zeitweiligen E/A-Fehlern gehabt.
Ich weiß, dass dieses Thema ziemlich alt ist, aber der gleiche Fehler trat bei I2C und PCA9685 auf, wenn Werte eingegeben wurden, die nicht im Bereich waren. Ich fand es einfach heraus, I2C zu deaktivieren und zu aktivieren:
Sudo raspi-config
Sudo reboot now
Sudo raspi-config
Sudo reboot now
Danach erkennt Sudo i2cdetect -y 1
mein I2C-PWM-Modul wieder.
Ich hatte das gleiche Problem in einer RasPi -> ATMEGA Kommunikation und löse es auf dem Slave. Diese Fehlermeldung tritt auf, wenn Ihr Slave nicht antwortet.
Ich habe den folgenden Code auf RasPi ausprobiert, wobei ein I2C-Slave am I2C-Bus angeschlossen und mit der Adresse 0x8 konfiguriert wurde:
von smbus importieren Sie den SMBus
I2C_Bus = SMBus (1)
SLAVE_ADD = 0x8
I2C_Bus.write_byte (SLAVE_ADD, 0xAA)
Vorausgesetzt, der I2C-Slave ist für die Bestätigung gut konfiguriert, sollte es funktionieren!