Frage

Ich habe ein Python -Skript, das Datenpakete in ein Arduino -Board schreibt pyserial. Manchmal erhöht Pyserial beim Schreiben des Codes einen Eingangs-/Ausgangsfehler mit ERRNO 5.

Einige Untersuchungen besagen, dass dies einen Fehler beim Schreiben in der Datei zeigt, die die Verbindung zum Arduino -Board darstellt.

Der Code, der sendet, sendet nur einzelne Byte -Pakete:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # Check if it's an integer
    elif isinstance(byte, int):
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it
    else: raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

Der von diesem Code gedruckte Fehler lautet:

OS -Fehlereingang/Ausgangsfehler errno 5

Stimmt etwas in meinem Code beim Senden nicht? Muss ich überprüfen, ob die serielle Verbindung bereit ist, etwas zu senden, oder sollte nach dem Senden eine Verzögerung bestehen? Oder könnte es ein Problem mit der Hardware oder der Verbindung mit der Hardware geben?

Bearbeiten: Ich habe mich mit der Linux -Implementierung von Pyserial befasst und die Implementierung gibt nur den Fehler an meinen Code weiter. Also keine neuen echten Einblicke von dort. Gibt es eine gute Möglichkeit, zu testen, was im Programm passiert?

War es hilfreich?

Lösung

Es tut mir leid, dass ich Sie gestört habe, aber ich bin mir sehr sicher, dass der Fehler durch das Zurücksetzen des Arduino selbst verursacht wird und damit die Verbindung zum Computer schließt.

Andere Tipps

Das einzige Problem, das ich sofort in Ihrem Code sehen kann, ist ein Eindringungsproblem - ändern Sie Ihren Code wie folgt:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # else, check if it's an integer
    elif isinstance(byte, int): 
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it 
    else: 
        raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

Ich bezweifle, dass Ihr Fehler daraus kommt, aber versuchen Sie es so und lassen Sie es uns wissen! Sie haben überprüft, ob byte ist ein int Nur in dem Fall, in dem es a ist str, so die elif stets per Definition gescheitert. Aber ich denke, wenn du real Code -Eindringung war so gewesen, Sie hätten eine bekommen SyntaxError, Ich denke, Sie haben sich nur beim Posten nicht einig gemacht und Ihr eigentliches Problem bleibt versteckt.

Wenn Sie dies unter Windows ausführen, können Sie die Arduino -IDE nicht gleichzeitig mit einer seriellen Verbindung öffnen, in der Sie Ihr Python -Skript ausführen. Dies wirft den gleichen Fehler auf.

Lassen Sie mich versuchen, ein paar Kommentare anzugeben, die Ihnen und anderen Leuten mit ähnlichen Problemen hilfreich sein könnten. Versuchen Sie zunächst, Ihre Arduino -Skizze ein paar Mal mit dem Serienmonitor auszuführen. Sie finden den seriellen Monitor unter Tools im IDE -Menü. Sie können auch Strg-Shift-M eingeben, um den seriellen Monitor aufzurufen.

Der serielle Monitor zeigt an, was die Arduino -Skizze an Sie zurücksendet. Sie können jedoch auch Daten eingeben, die an die Arduino -Skizze gesendet werden. Mit anderen Worten, Sie testen und debuggen beide Seiten des seriellen Datenflusss, nur mit dem seriellen Monitor.

Schau dir an, was auftaucht. Es ist häufig hilfreich, wenn Ihre Skizze versucht, Daten über serial.print () zurück zu senden. Ein paar Notizen. Stellen Sie absolut sicher, dass die im Serienmonitor festgelegte Baudrate genau mit der Baudrate in Ihrer Skizze übereinstimmt (9600 ist in fast allen Fällen eine gute Wahl).

Die zweite Note ist kritisch. Durch die Erhöhung des Serienmonitors wird ein Zurücksetzen auf das Arduino Board erzwungen. Ihre Skizze beginnt von vorne (immer). Dies ist eine gute Sache, weil es Ihnen jedes Mal einen Neulauf verleiht. Beachten Sie, dass Sie einen Reset erzwingen können, indem Sie die Baud -Rate auf 9600 festlegen (auch wenn er bereits 9600 ist). Auf diese Weise können Sie viele Tests innerhalb des seriellen Monitors durchführen, ohne den seriellen Monitor jedes Mal neu starten zu müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top