USB Virtual COM Port auslesen?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    nach einiger Suche online konnte ich mir immernoch nicht die Frage beantworten, ob man auf dem RPi4 per USB Seriell Geräte auslesen kann?

    Ich habe vor zum Beispiel einen Arduino per USB zu verbinden und möchte mir einfach nur seriell gesendete Daten anzeigen lassen.

    Ausprobiert habe ich das bereits erfolglos. Das unten zu sehende python Script soll eben genau dies tun. Online habe ich gelesen, dass ttyACM0 eigentlich vom Bluetoothmodul besetzt ist und das die Baudrate wohl nicht exakt ist, wenn die CPU Frequenz Lastabhängig geregelt wird.

    folgende Ports werden mir angezeigt:

    python -m serial.tools.list_ports

    /dev/ttyACM0

    /dev/ttyAMA0

    2 ports found

    ttyAMA0 habe ich auch schon ausprobiert.

    Weiß jemand eventuell Abhilfe? :helpnew:

  • Du würfelst zwei Dinge durcheinander. USB seriell funktioniert dem Pi genauso wie mit jedem anderen USB Host unter Linux. Es geht also.

    Zusätzlich dazu hat der Pi echte UARTs. Einer wird wahlweise für BT genutzt, oder eben nicht. Ein anderer ist etwas weniger stabil. Darum schaltet man den von BT gelegentlich ab.

    Seit dem Pi 4 gibt es noch 3 mehr von den „guten“ und man braucht das BT nicht anfassen.

    Aber Achtung: in allen Fällen können die nur 3.3V. Der arduino ist oft 5 V. Es kann also sein, dass man da eh was zwischenschalten muss, da kann man auch gleich ein USB seriell wandler nehmen.

  • Du würfelst zwei Dinge durcheinander. USB seriell funktioniert dem Pi genauso wie mit jedem anderen USB Host unter Linux. Es geht also.

    Zusätzlich dazu hat der Pi echte UARTs. Einer wird wahlweise für BT genutzt, oder eben nicht. Ein anderer ist etwas weniger stabil. Darum schaltet man den von BT gelegentlich ab.

    Seit dem Pi 4 gibt es noch 3 mehr von den „guten“ und man braucht das BT nicht anfassen.

    Aber Achtung: in allen Fällen können die nur 3.3V. Der arduino ist oft 5 V. Es kann also sein, dass man da eh was zwischenschalten muss, da kann man auch gleich ein USB seriell wandler nehmen.

    Hm wird dann mein Controller per USB nicht richtig erkannt? Ich finde keine Info darüber welchen Serial Port ich dann verwenden soll. Momentan habe ich ein STM32 Controller mit ST-Link V2.1 angeschlossen. Der hat auch die Möglichkeit per COM Port zu kommunizieren. Fehlen dem Raspberry dafür vielleicht einfach die Treiber?

  • dmesg | grep usb

    ergibt folgende Ausgabe:

    [19024.980624] usb 1-1.3: USB disconnect, device number 7

    [19029.030198] usb 1-1.3: new full-speed USB device number 8 using xhci_hcd

    [19029.167668] usb 1-1.3: New USB device found, idVendor=0483, idProduct=374b, bcdDevice= 1.00

    [19029.167687] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3

    [19029.167703] usb 1-1.3: Product: STM32 STLink

    [19029.167718] usb 1-1.3: Manufacturer: STMicroelectronics

    [19029.167731] usb 1-1.3: SerialNumber: 0672FF373333484D43043557

    [19029.231383] usb-storage 1-1.3:1.1: USB Mass Storage device detected

    [19029.231900] scsi host0: usb-storage 1-1.3:1.1

  • Laut Ausgabe ist das ein Massenspeichergerät. Nicht USB Serial. Kann man den umschalten? Wenn nicht, kann man das ggf auch erzwingen. Oder schau mal hier: https://unix.stackexchange.com/questions/5671…t-listed-as-tty

    Hm es wird bei mir auch als ttyAMC0 erkannt wenn ich es einstecke., wie man ja oben sieht.

    Ich habe einen USB-RS232 Adapter versuchsweise angesteckt. Da sollte jetzt eigentlich erstmal nichts kommen, trotzdem wird bei mir in der Console auf dem Pi etwa jede sekunde b''ausgegeben. Das Selbe passiert, wenn ich im Python Programm Port ttyAMA0 "beobachte".

  • Ah, ACM0 vs AMA0 - das habe ich übersehen.

    Und wenn du einen 1-sekündigen Timeout bei der seriellen Schnittstelle vereinbarst, dann kommt readline auch jede Sekunde zurück. Leer.

  • Ah, ACM0 vs AMA0 - das habe ich übersehen.

    Und wenn du einen 1-sekündigen Timeout bei der seriellen Schnittstelle vereinbarst, dann kommt readline auch jede Sekunde zurück. Leer.

    Ah, klar natürlich gibt er dann jede Sekunde eine leere Zeile zurück :blush:

    Wenn ich die ganze Sache mit python3 starte, bekomme ich die oben erwähnte ausgabe immer als b'' zurück. Mit python 2.7 bekomme ich einfach nur leere Zeilen.

    Ich habe es jetzt auch geschafft immerhin schonmal etwas mit der seriellen Schnittstelle auszulesen. Zwar nicht mit dem STM32 Nucleo Board aber mit einem USB-RS232-Adapter kann ich etwas empfangen. Dieser wird auch vom Pi als ttyUSB0 erkannt.

  • Da sollte jetzt eigentlich erstmal nichts kommen, trotzdem wird bei mir in der Console auf dem Pi etwa jede sekunde b''ausgegeben.

    Wenn ich die ganze Sache mit python3 starte, bekomme ich die oben erwähnte ausgabe immer als b'' zurück.

    Dann passe einfach den print() Befehl an:

    Python
    if x:
        print(x)
  • Dann passe einfach den print() Befehl an:

    Python
    if x:
        print(x)

    Gibt es auch eine einfache Methode um den empfangenen Text nicht immer mit b'' dargestellt zu bekommen? In Python3 siehts immer z.B. so aus:

    b'Empfangener Text'.

    Bezüglich des ST-Link Treibers bin ich leider immernoch nicht weiter fündig geworden. Anscheinend wird der COM Port einfach nicht von Linux unterstützt. Leider fehlt mir da auch sas Know-How um Möglichkeiten zu finden es möglich zu machen.

  • COM-Port des ST-Links wegen mangelnden Treiber nicht funktioniert

    STM32 kenne ich nur in Zusammenhang (ST-LINK/V2) mit den speziellen Controllern von ST Microelectronics. Und dann würde der gar keinen seriellen Port besitzen. Was hast Du da für ein Teil?

  • Python 3 hat (richtigerweise) keinerlei Ahnung, wie die empfangenen Daten enkodiert sind. Eine serielle Schnittstelle liefert erstmal nur Bytes, und um die richtig darzustellen, WENN sie denn Text sind, bedarf es eines encodings. Wenn du zB weisst, das es sich nur um Zeichen aus dem ASCII-Zeichensatz handelt, dann reicht ein einfaches

    string_data = data.decode("ascii")

    um da strings draus zu machen.

  • STM32 kenne ich nur in Zusammenhang (ST-LINK/V2) mit den speziellen Controllern von ST Microelectronics. Und dann würde der gar keinen seriellen Port besitzen. Was hast Du da für ein Teil?

    Exakt, die neueren NUCLEO Boards (Das sind Entwicklerboards für die unterschiedlichen STM32 Controller) haben ST-Links der Version 2.1. Solche ST-Links sind sowohl Debugger als auch Massstorage und Virtual COM-Ports.

    Siehe hier:

    https://www.mouser.de/datasheet/2/38…0r8-1848087.pdf

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!