Serial Ausgabe anders als im IDE Arduino

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kistk
User
Beiträge: 2
Registriert: Samstag 20. Juni 2020, 16:14

Hallo,

ich bin komplett neu in Python Programmierung.
Ich habe meine erste Test Datei.
Auf meinen Arduino hängt eine 4x4 Ziffernmatrix.
Ich habe folgenden Code geschrieben

Code: Alles auswählen

# pip install pyserial, Serial Port muss vorher installiert werden
import serial
import platform
import time

OSSystem = platform.platform()

if "Windows" in OSSystem:
    ser = serial.Serial(port='COM4')
elif "Linux" in OSSystem:
    ser = serial.Serial('/dev/ttyUSB0')
elif "OSX" in OSSystem:
    ser = serial.Serial('/dev/cu.usbmodem1421')
    
ser.flushInput()

while True:
    try:
        ser_bytes = ser.read()
        print(ser_bytes)
    except:
        print("Keyboard Interrupt")
        break
elif Linux / OSX ist nicht richtig, nur mal Platzhalter.

Das ist die Ausgabe was ich bekomme im Python:
C:\Users\****\Desktop>python serialPort.py
b'4'
b'7'
b'8'
b'0'
Keyboard Interrupt

C:\Users\****\Desktop>


Im Arduino Serial Monitor zeigt es mir nur die Zahlen an.
Woher kommt das "b" ?

Im Code musste ich kein
ser.open() oder ser.close() nutzen
ist .open() close() von SerialPort notwendig ?


Lg K
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du bekommst nunmal Bytes, und in Python wird ein Byte (im Gegensatz zu einem String) eben mit einem fuehrenden b ausgegeben. Dast ist aber nur die Ausgabe davon. Du kannst entweder mit bytes weiterarbeiten, oder unter Angabe eines encodings aus deinen Bytes einen String machen.

Und zu deinem Code: statt das serielle Objekt dreimal zu erzeugen, sollte man durch die OS-Weiche nur den Portnamen bestimmen lassen. Denn sonst aenderst du zB auch dreimal die Baudrate, falls das mal noetig sein sollte.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kistk: Das `open()` passiert bereits beim Erstellen des `Serial`-Objekts wenn man da einen Port angibt. `close()` wäre aber wichtig und löst man in diesem Fall aber über die ``with``-Anweisung. Wozu man dann auch wie von __deets__ schon gesagt die Erstellung aus der Betriebssystem-Weiche rausnehmen muss. Die würde man ohnehin besser über ein Wörterbuch lösen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

`ser` ist ein blöder Name. Keine kryptischen Abkürzungen in Namen oder gar als Namen.

Mittlerweile hat auch das PySerial-Projekt den Sinn von Namenskonventionen eingesehen, dementsprechend sollte man die alten Namen wie `flushInput()` nicht mehr verwenden.

Man verwendet keine nackten ``except:`` ohne konkrete Ausnahmen. Deine Ausgabe behauptet es wäre ein "Keyboard Interrupt", aber das kann alles mögliche gewesen sein.

Die Ausnahmebehandlung ist an der falschen Stelle. Das ``break`` ist ja nur notwending weil das *in* der ``while``-Schleife gemacht wird.

`time` wird importiert aber nicht verwendet.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import platform

import serial

PLATFORM_NAME_TO_PORT_NAME = {
    "Windows": "COM4",
    "Linux": "/dev/ttyUSB0",
    "OSX": "/dev/cu.usbmodem1421",
}


def main():
    try:
        port = PLATFORM_NAME_TO_PORT_NAME[platform.platform()]
        with serial.Serial(port) as connection:
            connection.reset_input_buffer()
            while True:
                print(connection.read().decode("ascii"))
    except KeyboardInterrupt:
        print("Keyboard Interrupt")


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
kistk
User
Beiträge: 2
Registriert: Samstag 20. Juni 2020, 16:14

Danke für die Aufklärung und Anpassung des Codes.
Es ist immer sehr nett, wenn Erfahrene Neulingen helfen.
Danke

Hab den Code ausprobiert.
Das mit den Platform Name ... verstehe.
Serial wird in die "Connection" geschrieben
Das Auslesen der Connection verstehe ich auch.

Aber irgendwie dürfte man nicht in die Schleife kommen.
Wenn ich das neue Python File aufruf über die CMD,
ist es gleich wieder vorbei und es kommt keine Ausgabe "Keyboard Interrupt"

Was ich am Code noch nicht ganz verstehe,
ist der letzte Bereich

Code: Alles auswählen

if __name__ == "__main__":
    main()

Ganz liebe Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kistk: Was heisst „irgendwie dürfte man nicht in die Schleife kommen“?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten