wake-up-neo.net

'IOError: [Errno 5] Eingabe-/Ausgabefehler' bei Verwendung des SMBus zum analogen Lesen über RPi

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

14
Sudhanshu Dixit

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.

16
adimitrov

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

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.

3
Daniel Loranger

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.

2
plaes

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.

1
Micah Larson

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:

  1. Sudo raspi-config
  2. '5. Schnittstellenoptionen '
  3. 'P5 I2C'
  4. 'Nein'
  5. 'OK'
  6. Sudo reboot now
  7. Sudo raspi-config
  8. '5. Schnittstellenoptionen '
  9. 'P5 I2C'
  10. 'Ja'
  11. 'OK'
  12. Sudo reboot now

Danach erkennt Sudo i2cdetect -y 1 mein I2C-PWM-Modul wieder.

0
Matt G.

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!

0
Alek6