/dev/ttyUSB0 nicht nachvollziehbares Verhalten

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

    ich betreibe einen Arduino Nano (China-Clon) mit dranhängendem LED-Dotmatrix Display an der seriellen Schnittstelle.

    An einem Windows Laptop und auch am Raspi 4 funktioniert das Ansteuern des Nano über die serielle Schnittstelle innerhalb der Arduino IDE.

    Wenn ich nun direkt auf die Schnittstelle schreibe:

    echo "test" > /dev/ttyUSB0

    sollte der LED-Matrix nun das Wort "test" erscheinen aber es wird der Nano "resetted"

    Die Ausgabe auf die Alternative /dev/serial/by-id/.... führt zum selben Ergebnis.

    Die Ausgabe ist auf 9600 eingestellt.

    Woran kann denn das liegen?

  • Wenn ich nun direkt auf die Schnittstelle schreibe:

    echo "test" > /dev/ttyUSB0

    sollte der LED-Matrix nun das Wort "test" erscheinen aber es wird der Nano "resetted"

    sagt wer?

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Also noch mal von vorn;

    Die angeschlossenen Platine arbeitet an anderen Rechnern wie sie soll. Auch an anderen Linuxrechnern über dem Echo-Befehl.

    Sie arbeitet auch mit dem in der Arduino - IDE enthaltenem Seriellen Monitor.

    Die Schnittstelle ist also wahrscheinlich die richtige, auch weil sich von da aus der Arduino mit dem Programm beschreiben lässt.

    Es liegt also nahe, dass irgendwas nicht richtig eingestellt ist. Die mir belkannten Parameter scheinen richtig zu sein.

    Es funktioniert aber trotzdem nicht. Vielleicht habe ich ja trotzdem was falsch eingestellt.

  • Moin jrx,

    Also noch mal von vorn;

    Kann es sein das du ungeduldig bist über unsere Begriffstutzigkeit?

    Die Lösung ist ganz einfach, beschreibe dein Problem einfach besser und genauer.

    Dann kommt sowas:

    Die angeschlossenen Platine arbeitet an anderen Rechnern wie sie soll. Auch an anderen Linuxrechnern über dem Echo-Befehl.

    Mhm, an welchen Linuxrechner funktioniert es den nicht?

    Ach und dann noch, hast du /dev/ttyUSB0 auch mit den richtigen Parametern versehen?

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Das kann jetzt einige Ursachen haben, daher die Rückfragen. Für uns ist es einfacher zu helfen, wenn wir relevante Details kennen. Wie hast Du die Schnittstelle für die Kommandozeile konfiguriert? Wie ist sie im seriellen Monitor des Arduino eingestellt? Wie sieht das Programm am Arduino aus, ...

    Ich hätte da noch eine Idee: Im Monitor wirst Du ja test zeichenweise eingeben. Es kann sein, dass Dein Arduino Programm Zeichen übersieht, wenn Du es "schnell" schickst. Schicke doch mal versuchsweise im Terminal die Zeichen einzeln:

    echo "t" > /dev/ttyUSB0

    echo "e" > /dev/ttyUSB0

    echo "s" > /dev/ttyUSB0

    echo "t" > /dev/ttyUSB0

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Arduino:

    Am Seriellen Monitor von der Arduino IDE kann man ja nur die Baudzahl einstellen (9600)

    Der Code auf dem Arduino ist ziemlich lang, das meiste sind Konstanten mit dem Bitmuster für die LED Matrix. Im Prinzip ist das meiste ähnlich den Beispielcode der verwendeten Bibliotheken..

    die wichtigen Schnipsel, die das Auslesen der seriellen Schnittstelle betreffen.

    Wie gesagt, der Arduino scheint korrekt zu funktionieren

    Auf dem Raspi:

    setzen und gucken, was eingestellt ist.

    Code
    $ stty -F /dev/ttyUSB0 9600
    
    $ stty
    speed 9600 baud; line = 0;
    -brkint -imaxbel

    #7: Der Vorschlag, die Zeichen einzeln zu senden, funktionert leider auch nicht.

  • Hallo jrx,

    das sagt mir nur, dass das Terminal mit 9600 Baud arbeitet.

    Ob der Versuch, /dev/ttyUSB0 mit 9600 Baud zu betreiben, geglückt ist, lässt sich so nicht sagen.

    Was wäre denn die Ausgabe von

    Code
     stty -F /dev/ttyUSB0 -a

    Du musst alle Parameter der seriellen Schnittstelle abgleichen (Baudrate, Anzahl der Datenbits und der Stoppbits, Parität, Flusssteuerung, Verhalten von echo,..., ..., ...,).

    Mehr dazu verrät Dir man stty.


    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Code
    $ stty -F /dev/ttyUSB0 -a
    speed 9600 baud; rows 0; columns 0; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
    stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
    -parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
    opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

    eol ist undefiniert, Wenn ich aner einen Nullterminierten String in die Schnittstelle schicke, dann gibts ja zwangsläufig ein EOL?

  • An einem Windows Laptop und auch am Raspi 4 funktioniert das Ansteuern des Nano über die serielle Schnittstelle innerhalb der Arduino IDE.

    Die Sache ist, dass der nano beim Oeffnen der seriellen Schnittstelle durch die Hardware neu gestartet wird. Der FTDI Chip auf dem nano zieht die RTS DTR Leitung beim Oeffnen der Schnittstelle auf Masse, und diese ist über einen seriellen Kondensator mit dem Reset Pin des Mikroprozessors auf dem Nano verbunden.

    Das passiert in der Arduino iDE ebenso, du merkst es nur nicht weil es sich um ein Terminal handelt, und in dem Moment wo du "Test" sendest ist der nano bereits neu gestartet. Ebenso bei Windows, wenn du etwa Putty oder Teraterm verwendet hast.

    echo "test" > /dev/ttyUSB0

    Das kann meiner Meinung nach gar nicht funktionieren. Der Befehl schickt die Ausgabe "test" an den seriellen Port, aber im Hintergrund muss der Port erst geoeffnet werden, das resettet den nano, und bis der bereit ist die Ausgabe entgegenzunehmen ist der Port schon wieder zu, die Ausgabe "test" verschwindet also im Nirvana.

    Probier es doch am Raspberry mit minicom.

  • Klingt logisch.

    Wenn ich mit minicom die Schnittstelle einstelle und dann das Programm ohne Reset beende, bleibt das device offen und echo funktioniert :-).

    Ich würde gerne Text aus einer Datei) übertragen, ich habe jetzt bei minicom keinen Parameter dafür gefunden, nur -S für script.

    Habe ich was übersehen?

    Eigentlich habe ich manpage durchgesehen und nichts gefunden.

  • Moin jrx,

    Probier es doch am Raspberry mit minicom.

    Ich denke nurazur meint es anders.

    Du sollst dein Wort "Test" in minicom schreiben.

    Zur Erklärung: Wenn minicom die Schnittstelle geöffnet hast, hat kein anderer Zugriff auf diese Schnittstelle.

    Also entweder das Programm minicom nutzen oder du schreibst selbst eine Anwendung mit Texteingabe.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Ich denke schon, dass ich nurazur richtig verstanden habe. Ich komme prinzipiell weiter.

    Eine eigene Anwendung zu schreiben wäre ja nicht schlecht, allerdings wäre das hier bei mir: "Code aus dem Internet kopieren und kompilieren".

    Das geht dann vielleicht - aber das Problem hab ich immer noch nicht verstanden.

  • Wenn ich nurazur richtig verstanden habe, löst der echo Befehl einen Reset des Nano aus. Dadurch würde der gesendete Befehl entweder während des Reset oder im void setup() ankommen. Mir ist das zwar neu, könnte aber durchaus sein. Du könntest das überprüfen, indem Du eine LED für ein paar 100ms im Setup einschaltest und diese beim Senden des echo Befehls beobachtest...

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • ch denke nurazur meint es anders.

    Du sollst dein Wort "Test" in minicom schreiben.

    So wars ursprünglich gemeint.

    Wenn ich nurazur richtig verstanden habe, löst der echo Befehl einen Reset des Nano aus. Dadurch würde der gesendete Befehl entweder während des Reset oder im void setup() ankommen. Mir ist das zwar neu, könnte aber durchaus sein.

    ich kann dir versichern, das ist wirklich so. Das muss auch so sein, denn sonst koennte man den Arduino nano nicht mit dem seriellen Interface flashen ("It is not a bug, it is a feature!"). Dass der echo Befehl nach Beenden von minicom jetzt funktioniert, ist jetzt mir neu, ich würde so aber nicht arbeiten wollen. Der Vorschlag war nur zum Testen gedacht.

    Ich habe übrigens was Falsches geschrieben, der FTDI Chip ist mit DTR verbunden, nicht RTS, ich habs in meinem Beitrag korrigiert. Man koennte jetzt theoretisch, um den Reset zu vermeiden, den Kondensator entfernen der zwischen der DTR Leitung und den Reset Pin liegt, aber dann kann man den nano nicht mehr flashen.

    jrx , ich loese solche Dinge mit Python. Das ist DIE Sprache für den Raspberry Pi, und Python ist vorinstalliert. Da braucht man nicht kompilieren.

    Die einzige Hürde ist dass man das Modul pyserial noch extra installieren muss. Ausser dass man etwas Python Grundlagen verstehen sollte.

  • Moin!

    Ich habe mal einen kleinen Code für euch.

    Spoiler anzeigen

    Übersetzen und übertragen. In der IDE das Monitorfenster öffnen. Da sieht man schon das schnelle Blinken.

    Dann im einem beliebigen Terminal den Echo-String eingeben.

    Dann sieht es so aus.

    Code
    echo "Test" > /dev/ttyUSB0
    bash: /dev/ttyUSB0: Das Gerät oder die Ressource ist belegt

    Macht man den Monitor in der IDE zu und dann den Echostring in dem Terminal eingibt, ja , dann blinkt es wieder schnell.

    Ich hoffe ich konnten den Knoten lösen?!?

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

    Einmal editiert, zuletzt von Bernd666 (3. August 2022 um 15:48) aus folgendem Grund: o gegen i getauscht

  • Du könntest das überprüfen, indem Du eine LED für ein paar 100ms im Setup einschaltest und diese beim Senden des echo Befehls beobachtest...

    ich kann dir versichern, das ist wirklich so.

    Macht man den Monitor in der IDE zu und dann den Echostring in dem Terminal eingibt, ja , dann blinkt es wieder schnell.

    Danke vor allem an Bernd, dass Du meinen Vorschlag das gleich mal umgesetzt hast. Somit ist (auch mir) klar, dass der Nano bei jedem echo Befehl bootet...

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Moin jrx,

    hast du mal daran gedacht eine Softseriell zu nutzen?

    Einfach RX, TX und GND mit einem USB-Seriell-Adapter verbinden und da deine Abfrage nach dem Codewort zumachen.

    Ich habe es aber nicht getestet. Ist nur eine Überlegung.

    73 de Bernd

    //EDIT So, kurzer Test. Es geht.

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

    Einmal editiert, zuletzt von Bernd666 (3. August 2022 um 22:17)

Jetzt mitmachen!

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