Seite 1 von 1

Serial Ausgabe anders als im IDE Arduino

Verfasst: Samstag 20. Juni 2020, 16:32
von kistk
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

Re: Serial Ausgabe anders als im IDE Arduino

Verfasst: Samstag 20. Juni 2020, 16:41
von __deets__
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.

Re: Serial Ausgabe anders als im IDE Arduino

Verfasst: Samstag 20. Juni 2020, 18:36
von __blackjack__
@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()

Re: Serial Ausgabe anders als im IDE Arduino

Verfasst: Samstag 20. Juni 2020, 19:03
von kistk
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

Re: Serial Ausgabe anders als im IDE Arduino

Verfasst: Samstag 20. Juni 2020, 19:45
von __blackjack__
@kistk: Was heisst „irgendwie dürfte man nicht in die Schleife kommen“?