Serielle Kommunikation über TX und RX Pin funktioniert nicht

  • Guten Tag.


    Weiss vielleicht irgendjemand wie man den Arduino mit dem Raspberry Pi (Zero 2) über die GPIO's (TX und RX) zusammen kommunizieren lässt, mit Bash?

    Auf dem Arduino sollte alles klar sein. Und normalerweise taucht über USB angeschlossen auf dem Raspberry Pi eine Datei (/dev/ttyUSB0, oder /dev/ttyACM0) auf, aus der man ganz einfach mit "cat" das Empfangene in eine Datei weiterleiten kann. Aber über die TX und RX GPIO's angeschlossen taucht nichts auf, und auch aus /dev/ttyS0 oder /dev/ttyAMA0 kommt nichts heraus, es kommt jetzt nicht einmal etwas aus ttyUSB0 heraus, und seit kurzem leuchten alle LED's am Arduino wenn er über USB mit dem Raspberry Pi verbunden ist, anstatt dass eine LED immer blinkt weil etwas übertragen wird, keine Ahnung wieso das jetzt auf einmal ist, vielleicht weil ich im raspi-config "konsole über serial" oder so ähnlich deaktiviert, und "hardware serial" aktiviert habe. Am Pc taucht der Arduino jedenfalls über USB normal auf und gibt etwas aus.


    Kann mir vielleicht irgend jemand helfen? Wie kommuniziert den der Raspberry Pi über die GPIO's mit einem Arduino (mit Serial)?

    Ich habe den TX Pin vom Raspberry Pi mit einem Widerstand an den RX Pin des Arduino verbunden, und den RX Pin vom Raspberry Pi über zwei Widerstände mit dem TX Pin vom Arduino, so dass nur 3.3 V beim Raspberry Pi ankommen, und Ground habe ich auch verbunden. Ich hoffe das ist richtig?

    Wie lese ich den jetzt in einem Bash Script das übertragene aus, und sende etwas? Und wo ist das Äquivalent zum ttyUSB0?


    Wäre nett wenn mir jemand helfen kann.


    Danke vielmals

  • Hallo ka111,


    bevor man Dir helfen kann:


    Bist Du Dir sicher, dass Du nicht doch über /dev/ttyAMA0 kommunizieren solltest? Das ist zumindest nach meiner Erfahrung das geeignete Device für GPIO-TX und -RX.


    Du hast auch RX des RPi an TX des Arduino angeschlossen?


    Du hast - nachdem Du den Pegel des Arduino-TX auf < 3.3 V reduziert hast - an RPI-RX angeschlossen? Solltest Du den Pegel nicht angeschlossen haben, dann ist die Wahrscheinlichkeit echt groß, dass Du mindestens den GPIORX des RPi zerlegt hast.

    Die Hardware dazu nennt sich Spannungsteiler oder Pegelwandler (5V auf 3.3 V).


    Wenn Du Arduino und RPi über USB-Kabel verbunden hast, dann lautet das Device /dev/ttyACM0. Hier brauchst Du keine Pegel anzupassen.



    Nachdem das Elektronische erledigt ist:

    Hast Du die Schnittstelle übereinstimmend konfiguriert? Damit meine ich mindestens

    • Baudrate
    • Anzahl der Datenbits
    • Anzahl der Stopbits
    • Parität
    • Abschalten jeglicher Echos


    Wenn diese Konfiguration übereinstimmend festgelegt ist, kannst Du Daten von A nach B übertragen. Vorher kann der Empfänger nichts erkennen.


    Das Linux-Kommandos stty hält da über 60 Parameter bereit. man stty hilft Dir, ein Verständnis aufzubauen.



    Stelle bitte einen Schaltplan von DEINER Schaltung zur Verfügung - nicht von einem Tutorial, an Dem Du Dich orientiert hat.


    Was ist die Ausgabe von

    Code
    ls -al /dev/tty*


    wenn

    • kein USB-Kabel am RPi angeschlossen ist
    • wenn USB-Kabel am RPi angeschlossen ist
    • wenn USB-Kabel angeschlossen ist und Arduino läuft


    Was ist die Ausgabe von

    Code
    stty -F/dev/ttyXXXX

    XXXX ist dann ACM0, AMA0, USB oder was auch immer bei ls -al /dev/tty* entdeckt wurde.


    Wie lautet die Zeile Serial.begin() auf dem Arduino?



    Wenn Du unbedingt über Bash kommunizieren möchtest: Senden geht über echo "BlaBla" > /dev/ttyXXXX. Wenn Du sog. Escape-Sequenzen übertragen musst, dann läuft das über echo -e "BlaBla\r" > /dev/ttyXXXX


    Statt r kannst Du entsprechende Codes verwenden.


    Das von Dir angesprochene cat-Kommando lautet

    Code
    cat < /dev/ttyXXXX &

    Wichtig ist hier das  & am Ende, wodurch ein Hintergrundprozess gestartet wird.

    Ohne  & würde die serielle Schnittstelle nur ein einziges Mal ausgelesen werden - im Zweifelsfall ist nichts mehr da.


    In dem Zusammenhang ist es noch wichtig, ob einer beiden Systeme mit gepufferter Ausgabe arbeitet. Das solltest Du verhindern - oder ein sofortiges Senden mit flush() erzwingen. Auf dem Arduino gibt es da Serial.flush().



    Am Wichtigsten ist aber erstmal, die Unversehrtheit Deines RPi nachzuweisen...



    Beste Grüße


    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

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    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.

    Edited 4 times, last by Andreas ().

  • Wenn ich mich nicht völlig irre, muss auch GND zwischen den beiden Geräten verbunden sein. Nicht dass das vielleicht fehlt...

    [...] und Ground habe ich auch verbunden.

    Ups, das hab ich überlesen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().

  • ka111 schrieb:


    und Ground habe ich auch verbunden. Ich hoffe das ist richtig


    Ja, das ist richtig. Ohne eine gemeinsame Masseverbindung zwischen zwei Geräten bekommt man keine stabile Kommunikation oder vernünftige Messung hin.


    Ich bin wegen #4 aus diesem Thread raus... sorry ka111.

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

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    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.

    Edited once, last by Andreas ().

  • fred0815: "Du kannst RX und TX am Pi brücken, um zu sehen, ob die Kommunikation an sich beim Pi funktioniert."

    Aha, gut zu wissen, das muss ich mal ausprobieren, danke.


    Andreas: "Bist Du Dir sicher, dass Du nicht doch über /dev/ttyAMA0 kommunizieren solltest? Das ist zumindest nach meiner Erfahrung das geeignete Device für GPIO-TX und -RX. "

    Ich weiss nicht wirklich was ttyAMA0 ist, habe nur kurz gelesen dass darüber Bluetooth läuft, und Bluetooth möchte ich (im Moment) nicht verwenden.


    "Du hast auch RX des RPi an TX des Arduino angeschlossen?" <<< Ja


    "Du hast - nachdem Du den Pegel des Arduino-TX auf < 3.3 V reduziert hast - an RPI-RX angeschlossen?" <<< Ja, so dass nur 3.3V am Pi ankommen, als Spannungsteiler.


    "Wenn Du Arduino und RPi über USB-Kabel verbunden hast, dann lautet das Device /dev/ttyACM0. Hier brauchst Du keine Pegel anzupassen."

    Eigentlich wollte ich den Strom des Pi's ein und ausschalten mit einem Optokoppler und dem Arduino, und dachte dann bekommt der Pi Strom vom Arduino über USB, mir fällt aber gerade ein dass das ja die falsche Richtung ist, und der Pi gar nicht läuft nehme ich an wenn er nur noch über USB mit einem Arduino verbunden ist... Jedoch würde dann einfach ein Kabel zur Seite ziemlich viel Platz zusätzlich verbrauchen, und GPIO's würde ich sowieso benutzen, also es wäre mir eigentlich lieber wenn ich die GPIO's benutzen könnte, aber wenn es nicht gut geht könnte ich sonst nochmals darüber nachdenken...


    "Hast Du die Schnittstelle übereinstimmend konfiguriert? Damit meine ich mindestens"

    Nein, gar nichts, am Pc mit Ubuntu kann ich den Arduino einfach anschliessen und von ttyUSB0 das Mitgeteilte lesen, ohne irgendwelche Baudraten konfigurieren zu müssen oder sonstiges.

    Aber, weiter Unten schreibst du noch etwas von stty, das stimmt, ich habe vergessen dass ich das früher auch in meinen Scripten verwendet habe, und wirklich so die Baudrate eingestellt habe. Das muss ich mir nochmals anschauen. Aber trotzdem erscheint gar kein tty-irgendwas, ich wüsste gar nicht wohin ich denn lesen und schreiben sollte, über USB taucht ttyUSB0 oder ttyACM0 auf (je nach Arduino), und ich kann mindestens lesen davon.


    Alles was du weiter unten noch geschrieben hast muss ich am Abend mal anschauen und zurück schreiben, es sollte aber eigentlich über USB funktionieren, nur mit den GPIO's erscheint halt kein tty...


    Und ja, Ground habe ich auch angeschlossen.


    Danke allen für die Hilfe bis jetzt, ich muss das am Abend mal alles durchschauen und dann zurück schreiben.

  • Also, ich habe jetzt noch herausgefunden, dass es am Pc auch nur geht zum auslesen, wenn ich vorher den Serial Monitor in der Arduino IDE geöffnet hatte, sonst funktioniert es auch am Pc (über USB) nicht ohne die Konfiguration mit stty. Aber wenn ich den alten stty Befehl wieder benutze ("sudo stty -F /dev/ttyUSB0 115200 raw -echo"), dann funktioniert es am Pc zum auslesen von ttyUSB0, jedoch nicht zum senden nach tty, ich habe keine Rechte dazu (auch mit sudo nicht), keine Ahnung wieso. Am Raspberry Pi funktioniert es zu lesen und ich sehe auch keine Meldung das ich nicht senden konnte, jedoch reagiert der Arduino nicht auf das gesendete und gibt weiterhin nur das Gleiche aus. Mit dem Serial Monitor aus der Arduno IDE funktioniert alles und der Arduino reagiert auf das gesendete. Früher hatte ich das aber genau so gemacht mit einem anderen PI. Also ich weiss nicht was das soll, diese Serielle Kommunikation funktioniert einfach jedes mal auf eine andere Art nicht, die macht einfach nur Probleme, ich weiss gar nicht ob ich die überhaupt noch verwenden soll...


    Und zu den GPIO's bin ich noch nicht einmal gekommen, wieso auch wenn es sowieso nicht einmal mit USB funktioniert...


    Nach der Anleitung von InterGeek (danke dafür), müsste ich UART aktivieren und Bluetooth abschalten, danach sollte es bei AMA0 funktionieren, aber wieso muss ich das den alles so machen, ich wollte Bluetooth auch nicht ausschalten, nur im Moment nicht nutzen, wenn ich über USB anschliesse taucht doch auch einfach ein neues tty auf, wieso muss ich über die GPIO Pins Bluetooth ausschalten und den Bluetooth tty verwenden und lauter Zeug in Dateien ändern, wenn über USB einfach ein neues erscheint und ein stty Befehl reichen sollte um alles zum laufen zu bringen?


    Der Schaltplan ist übrigens genau so wie im Link von InterGeek unter Serielle GPIO Kommunikation, mit den Widerständen, nur das ich 1.5K Ohm und 3K Ohm verwendet habe, und nichts was mit den LED's zu tun hat angeschlossen habe, aber den Spannungswandler genau so wie es dort eingezeichnet ist. Ich denke das ist der bessere Schaltplan, auch wenn Andreas geschrieben hat ich soll keinen Link nenne, ich bin ein schlechter Zeichner, es würde nicht besser heraus kommen wenn ich den jetzt nochmals abzeichne...


    Und wegen dem was für tty's am Pi auftauchen von Andreas, ohne und mit Kabel (ohne Arduino) gibt es viele tty0 - ttyX, und sonst nur ttyAMA0, ttyprintk und ttyS0. Und wenn ich den Arduino anschliesse erscheint noch ttyUSB0 (Jetzt aber ohne irgend welche RX Pins verbunden zu haben, glaube das war mit den Pins genau gleich).


    Der Rest von Andreas ist gut zu wissen (danke), oder habe ich auch schon so gemacht, ausser das mit "flush", das habe ich nie gemacht und hat aber immer funktioniert.



    Also ich weiss gar nicht ob ich an der Seriellen Kommunikation noch weiter machen soll, weiss den irgend jemand wieso jetzt einfach keine Reaktion mehr statt findet wenn ich das mache:



    Wieso funktioniert jetzt nicht einmal mehr das? Das hat früher so mit echo > tty und cat tty immer funktioniert an einem anderen Pi.

  • Hallo ka111,


    ich weiß nicht, was Du unter sudo rasp-config eingestellt hast.


    Ich entwickle gerade ein Messgerät, dass die gesamte Kommunikation über die serielle Schnittstelle vornimmt.

    Das läuft seit nunmehr 4 Monaten sehr stabil. Jeden Tag programmiere ich entweder neue Features dazu oder dokumentiere die Validierungstest-Ergebnise.


    Bei mir gibt es keinen Konflikt mit Bluetooth. Es läuft alles über /dev/ttyACM0.


    Denke auch daran, dass immer nur EIN Empfänger empfangen kann. Wenn einen Dienst auf dem RPi (nichts anderess hast Du bei cat < /dev/ttyACM0 &) aktiviert hast, dann kann keine andere Software von der seriellen Schnittstelle noch Daten erhalten.


    Du musst dann schon noch auf die Fragestellungen und Hilfestellungen eingehen, sonst wird das hier nichts. So ist Deine Aussage echo > tty und cat tty nicht funktional.



    Beste Grüße


    Andreaas

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

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    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.

  • Hallo Andreas.


    "ich weiß nicht, was Du unter sudo rasp-config eingestellt hast."

    Dort habe ich nur das mit der seriellen login Konsole deaktiviert, und in der anschliessenden Frage das Hardware Serial aktiviert, es gab nur 1 Punkt zu Serial wo man diese 2 Sachen einstellen konnte.


    "Ich entwickle gerade ein Messgerät, dass die gesamte Kommunikation über die serielle Schnittstelle vornimmt.

    Das läuft seit nunmehr 4 Monaten sehr stabil. Jeden Tag programmiere ich entweder neue Features dazu oder dokumentiere die Validierungstest-Ergebnise.


    Bei mir gibt es keinen Konflikt mit Bluetooth. Es läuft alles über /dev/ttyACM0."


    Dann wirst du wahrscheinlich viel besser mit all dem draus kommen, ich kann nicht so gut programmieren. Aber da taucht schon der erste Widerspruch auf, wieso muss ich den Bluetooth deaktivieren (nach der Anleitung), wenn es bei Dir auch mit funktioniert?

    Und ja, wenn es denn mal läuft auf irgend einem Raspberry Pi, dann läuft es schon eigentlich ohne Probleme immer so (mindestens solange man nichts updatet), aber jedes Mal wenn man es auf einem neuen System versucht funktioniert es sicher zuerst auf wieder ganz andere Art nicht, oder kannst du Dir erklären wieso der Arduino mit dem Serial Monitor jetzt richtig funktioniert, auf Ubuntu ich trotz root keine Rechte habe um nach tty zu schreiben, und auf dem Raspberry das aber scheinbar geht aber trotzdem der Arduino nicht darauf reagiert? Weist du wieso das im Code-Block nicht funktioniert? Es sollte doch, oder?


    "Denke auch daran, dass immer nur EIN Empfänger empfangen kann. Wenn einen Dienst auf dem RPi (nichts anderess hast Du bei cat < /dev/ttyACM0 &) aktiviert hast, dann kann keine andere Software von der seriellen Schnittstelle noch Daten erhalten."

    Das ist gut zu wissen, frage mich aber was ist wenn ich nicht ACM0 nutze sondern USB0? Kann dann Bluetooth in dem Moment in dem ich über USB0 mit dem Arduino kommuniziere auch nichts mehr senden und empfangen? Oder geht dass dann doch, weil es nicht mehr die gleiche Schnittstelle ist?


    "Du musst dann schon noch auf die Fragestellungen und Hilfestellungen eingehen, sonst wird das hier nichts. So ist Deine Aussage echo > tty und cat tty nicht funktional."

    Welche Frage und Hilfestellung jetzt? Ich dachte ich hätte jetzt alle beantwortet, mit TX und RX habe ich jetzt noch nicht weiter probiert, weil es funktioniert ja nicht einmal über USB.

    Wie gesagt, ich habe es jetzt genau so wie im Code-Block gemacht, und es funktioniert nur im Serial Monitor ohne den Pi, aber ich habe das immer so gemacht (auf einem Pi 3), und es hat genau dort immer funktioniert.

    Nur im raspi-config habe ich noch das erwähnte eingestellt, hoffe jetzt mal nicht dass das der Grund ist wieso echo nach tty nicht mehr funktioniert, wäre aber auch nicht logisch da ja cat von tty funktioniert.

  • Und wenn ich den Arduino anschliesse erscheint noch ttyUSB0

    Das wird die serielle Verbindung zum Arduino über USB sein.


    Wenn dein Setup fertig ist, was sagt dann ein:

    Code
    ls /dev/tty*


    Denke auch bitte daran, dass die Daten in beide Richtungen nicht als Klartext gesendet werden.

  • "Wenn dein Setup fertig ist, was sagt dann ein:"

    Welches Setup jetzt, das im Code-Block über USB? Dort wird "ls /dev/tty" dann die vielen tty0, tty20 ... sehen, und eben die ttyAMA0, ttyS0, ttyprintk und ttyUSB0.


    Zitat von ka111

    "Und wenn ich den Arduino anschliesse erscheint noch ttyUSB0"

    Das war nur eine Antwort auf eine Frage von Andreas..


    Zitat von InterGeek

    "Denke auch bitte daran, dass die Daten in beide Richtungen nicht als Klartext gesendet werden."

    Ja, sie werden glaube ich umgewandelt in Zahlen, oder vielleicht auch wieder zurück..

  • Also ich habe es jetzt noch mit einem Raspberry Pi 4 ausprobiert, mit diesem Script auf dem Arduino:

    Wenn ich jetzt auf dem Pi mit cat von tty auslese, kommen (endlos) immer mehr ???, ich nehme an weil Serial.read() nichts bekommen hat, da ich ja nichts gesendet habe.

    Breche ich cat ab, und warte einen Moment, und beginne wieder mit cat, dann kommen viele ??? (da sich ja viele aufgestaut haben), und wenn ich abbreche und gleich wieder beginne mit cat, dann kommen nur wenige (weil sich ja nicht viel aufgestaut hat). So weit scheint es logisch zu sein, oder?

    Aber breche ich jetzt cat ab, und sende "echo 9 > /dev/ttyUSB0", und fange wieder mit cat an, dann ist diese 9 nirgends, es kommt nur ein Block ??? . Aber wenn ich cat laufen lasse, und einen anderen Terminal aufmache, und dort echo 9 sende, dann taucht das 9 auf im anderen Terminal beim laufenden cat.

    Also ich verstehe das überhaupt nicht, das entbehrt mir jeglicher Logik, und ich kann so einfach nichts mit Serial anfangen...


    Ich glaube, ich versuche weiter eine ganz einfache und minimale Kommunikation über ein paar verbundene GPIO und digital Pins hinzukriegen, an der ich schon vor diesem Versuch mit Serial angefangen habe. Ausser hier weiss noch irgend jemand die erleuchtende alles erklärende Antwort, wieso Serial so handelt wie es handelt, aber mir erscheint das absolut unlogisch...

  • Wenn die Einstellungen für


    - 7/8 Bit Übertragung

    - Parity Bit

    - Stop Bit

    - Baudrate

    - Flow-Control


    nicht an beiden Endpunkten übereinstimmen,

    werden immer wirre Zeichen, Fragezeichen, oder garnichts, beim Empfänger angezeigt.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Hallo RTFM,


    das schrieb ich bereits in meinem ersten Beitrag (#2).


    Trotz intensivem Bemühen konnte aber bislang nichts und niemand den TE dazu bringen, seine seit anno dazumal offensichtlich unveränderte Schnittstellenkonfiguration in Frage zustellen.


    Es hatte ja vorher immer funktioniert. Sagt er.



    Bei mir gleicht meine Software die Schnittstellenkonfiguration ab, bis es funktioniert - sollte es die Standard-Konfiguration nicht packen.


    Solange nichts oder nur nur wirres Zeug aus der seriellen Schnittstelle gelesen werden können, ist die Inkompatibilität der Konfiguration sehr nahe liegend. Aber wohl noch nicht nahe liegend genug. Für den TE, um die vorhandenen Tipps zu befolgen.



    Beste Grüße


    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

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    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.

  • Hallo ka111,

    Wie kommst Du bei Deinem geposteten Code darauf, dass Du nichts gesendet hast?


    Ich sehe einen Schreib-Befehl, einen Lese-Befehl mit noch einem Schreibbefehl, der das Gelesene über die serielle Schnittstelle zurückgibt.


    Wenn Du keines der vielfältigen Echos am RPi ausgeschaltet hast, dann potenziert sich das Datenaufkommen an der seriellen Schnittstelle zu dem, was Du beobachtet hast. Tipp: Du hast offensichtlich ECHOing zugelassen. Sollte man nicht machen. Macht man auch nur zu Testzwecken, wenn die Kommunikation so gar nicht will. Sonst gibt es dazu keinen Grund.


    Ich habe schon ein paar Mal danach gefragt: Wie sieht Dein cat-Kommando exakt aus? Du kannst das Kommando so eingeben, dass nur einmal der gesamte und gesammelte Inhalt ausgelesen wird - und danach nichts mehr. Du kannst es aber auch so festlegen, dass bis zum Abbruch des Hintergrundprozesses alles, was jemals noch auf der seriellen Schnittstelle eintrudeln werden wird, zeitnah ausgegeben wird.


    Hast Du die "9" vom Terminal des RPi zur seriellen Schnittstelle gesendet, während ein "cat" in korrekter Form auf Eingang gelauert hat?


    Sorry, solange Du nur vage Andeutungen über Deine Aktivitäten machst und niemals ein Linux-Kommando nachvollziehbar verrätst, kann Dir hier niemand helfen. Auch wenn - wie bei mir - langjährige Erfahrungen bzgl. serielle Schnittstellenprogrammierung etabliert sind.


    Meine selbst geschriebenen Programme arbeiten fehlerfrei mit der seriellen Schnittstelle. Also funktioniert die Kommunikation zwischen Arduino und RPi prinzipiell ebenso fehlerfrei.


    Demzufolge liegt der Fehler irgendwo bei Dir und / oder Deiner Installation und / oder Konfiguration.

    Es obliegt nun Dir, uns detaillierte Informationen zur Verfügung zu stellen. Nach denen bereits mehrmals gefragt wurde. Und die benötigt werden, um die Fehlerursache soweit einzukreisen, dass Dir konkret geholfen werden kann,



    Code-Ausschnitt Arduino Nano R3-Kompatibel


    Auf dem RPi läuft folgender Code - Ausschnitt und auf das wesentliche Verständnis gekürzt:


    In meiner aktuellen Anwendung sendet die Software auf dem Raspberry Pi 400 neben vielen anderen Kommandos u.a. auch die Zeichenkette "pP\r".


    Die Software auf dem Arduino liest alle Zeichen bis zum Terminator '\r'. Zu dieser Information "pP\r" ist das Auslesen der Sensoren und Timer etc. vorgesehen. Die Rückmeldung erfolgt in einer Zeichenkette, die ebenfalls mit dem gleichen Terminator beendet wird.


    Dem Terminatorzeichen solltest Du eine gewisse Bedeutung zumessen. Du musst schließlich an irgendetwas erkennen können, ob die Rückmeldung korrekt abgeschlossen ist, ob noch was erwartet wird und demzufolge noch eine Zeit lang gewartet werden sollte, oder ob definitiv ein Übertragungsfehler vorliegt. Ebenso solltest Du erkennen können, ob die Rückmeldung zum Kommando gehört. Wenn es die Rückmeldung zu einem früheren Kommando darstellt, solltest Du nochmals lesen. Deutet die Rückmeldung daraufhin, dass der Empfänger nur "Bahnhof" zu verstanden haben scheint, ist es angebracht, das Kommando zu wiederholen und eine neue Antwort abzuwarten.


    Natürlich funktioniert eine Kommunikation auch ohne Terminatorzeichen - mit ist es aber einfacher und sicherer.


    [Ähnlich verhält es sich bei der sog. Flusssteuerng (auf die ich hier mal noch gar nicht eingehen möchte). Da sollte reichen, dass beiden Seiten eine identische Flusssteuerung zugeordnet wird (oder auch keine wie in meinem Beispiel).]



    Die Software auf dem RPi wertet die erhaltene Zeichenkette aus und gibt die Ergebnisse in einer Liste zurück.


    Das funzt etwa 100 mal pro Sekunde ohne jegliche Störungen.



    Also kann die Kombination "RPi" und "Arduino" das.



    Und im LXTerminal funzt das auch:

    Code
    pi@raspberrypi400:~/unicon/bin $ stty -F/dev/ttyACM0 57600 cs8 -parenb -cstopb -ixon -echo
    pi@raspberrypi400:~/unicon/bin $ cat < /dev/ttyACM0 &
    [3] 11477
    pi@raspberrypi400:~/unicon/bin $ echo -e "pP\r" > /dev/ttyACM0
    pi@raspberrypi400:~/unicon/bin $ 0.00;956;400;30;0000

    Schnittstellenkonfiguration

    In der ersten Zeile habe ich die serielle Schnittstelle auf das Pendant des Arduino-Codes abgestimmt. Wichtig ist hier auch die Übereinstimmung der Flusssteuerung (sdie ich mit -ixon ausgeschaltet habe).


    Auslesen der seriellen Schnittstelle als Hintergrundprozess

    In der zweiten Zeile steht der "cat"-Befehl, durch den das ständige Auslesen in den Hintergrund geschickt wird.


    Senden an die serielle Schnittstelle

    In der dritten Zeile schreibe ich was an die serielle Schnittstelle. Wichtig ist bei Auftreten von Nicht-ASCII-Zeichen (Steuerzeichen, Esc-Sequenzen, ...), dass die Option -e mitgegeben wird.


    Rückmeldung über die serielle Schnittstelle

    Und schon kommt prompt die Rückmeldung.


    Kann man dann sogar öfters wiedrholen:

    Code
    echo -e "pP\r" > /dev/ttyACM0
    pi@raspberrypi400:~/unicon/bin $ 0.00;998;400;30;0000
    echo -e "pP\r" > /dev/ttyACM0
    pi@raspberrypi400:~/unicon/bin $ 0.00;972;400;30;0000
    echo -e "pP\r" > /dev/ttyACM0
    pi@raspberrypi400:~/unicon/bin $ 0.00;957;400;30;0000
    echo -e "pP\r" > /dev/ttyACM0
    pi@raspberrypi400:~/unicon/bin $ 0.00;979;400;30;0000
    echo -e "pP\r" > /dev/ttyACM0
    pi@raspberrypi400:~/unicon/bin $ 0.00;971;400;30;0000

    Du siehst: Keine Fragezeichen, keine wirren Zeichen. Einfach nur Rückmeldungen gemäß Schnittstellenprotokoll.



    Beste Grüße


    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

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    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.

    Edited 2 times, last by Andreas ().

  • Ich weiss gar nicht was das alles ist ausser Baudrate, normalerweise verwendete ich nur diesen einen stty Befehl um alles zu konfigurieren "sudo stty -F /dev/ttyUSB0 9600 raw -echo"

    Ich weiss nicht einmal für was das raw und -echo steht. Es hat einfach so funktioniert...


    Das ist mir wohl entgangen, was soll ich den jetzt machen? Welche Tipps? Es ist ja schon über USB gescheitert, am Anfang waren wir noch bei der GPIO Verbindung.

    Weiter unten schreibst du noch etwas...


    Ich schreibe die nächste Frage von Dir (Andreas) jetzt mal so auf wie ich sie verstanden habe:

    Ich schreibe: "Wenn ich jetzt auf dem Pi mit cat von tty auslese, kommen (endlos) immer mehr ???, ich nehme an weil Serial.read() nichts bekommen hat, da ich ja nichts gesendet habe."

    Du fragst: "Wie kommst Du bei Deinem geposteten Code darauf, dass Du nichts gesendet hast?"

    < Das denke ich weil ich ja nie mit einem echo etwas an tty gesendet habe. Ich meinte nur, ich schliesse den Arduino an den Pi an, mache cat /dev/ttyUSB0, und erhalte sofort Fragezeichen. Weil der Arduino dauernd (auch wenn nichst vorhanden ist) Serial.read() macht. So denke ich jedenfalls dass das ist. Aber es ist nicht so wichtig wieso das jetzt so ist, es war jetzt einfach so.


    "Ich sehe einen Schreib-Befehl, einen Lese-Befehl mit noch einem Schreibbefehl, der das Gelesene über die serielle Schnittstelle zurückgibt."

    Ja, am Arduino, vielleicht haben wir uns missverstanden, ich meinte am Raspberry Pi, so wie ich es jetzt eine Frage weiter oben geschrieben habe.


    "Wenn Du keines der vielfältigen Echos am RPi ausgeschaltet hast, dann potenziert sich das Datenaufkommen an der seriellen Schnittstelle zu dem, was Du beobachtet hast. Tipp: Du hast offensichtlich ECHOing zugelassen. Sollte man nicht machen. Macht man auch nur zu Testzwecken, wenn die Kommunikation so gar nicht will. Sonst gibt es dazu keinen Grund."

    Ich weiss gar nicht was ECHOing sind, aber ich glaube noch mehr du hast mich missverstanden im letzten Beitrag mit den Fragezeichen die ich erhalte (oder nicht ganz so wie ich das gemeint hatte). Kann sein das diese ECHOing noch zusätzlich irgendwo Probleme machen würden, oder ich weiss nicht was du damit meinst.


    "Ich habe schon ein paar Mal danach gefragt: Wie sieht Dein cat-Kommando exakt aus? Du kannst das Kommando so eingeben, dass nur einmal der gesamte und gesammelte Inhalt ausgelesen wird - und danach nichts mehr. Du kannst es aber auch so festlegen, dass bis zum Abbruch des Hintergrundprozesses alles, was jemals noch auf der seriellen Schnittstelle eintrudeln werden wird, zeitnah ausgegeben wird."


    Ah das geht? Ich wusste nicht dass man cat noch auf verschiedene Arten verwenden kann, ich mache ganz einfach nur cat /dev/ttyUSB0, das bewirkt dass dauern aus ttyUSB0 gelesen wird, und der cat Befehl nie abgebrochen wird, ausser ich drücke ctrl+c.

    Wie macht man denn dass das mit cat nur 1x ausgelesen wird und nicht dauerhaft?


    "Hast Du die "9" vom Terminal des RPi zur seriellen Schnittstelle gesendet, während ein "cat" in korrekter Form auf Eingang gelauert hat?"

    Ob man dem jetzt korrekt gelauert sagen kann weiss ich nicht, jedenfalls hat es sozusagen gelauert, mit cat /dev/ttyUSB0. Und so funktioniert es auch dass ich die 9 zurück erhalte. Aber genau bei dieser Stelle ist ja das vollkommen unlogische, denn wenn ich cat wieder abbreche, und nicht mehr am lauschen bin, und vom gleichen Terminal aus 9 sende, und wieder cat anfange, dann sehe ich die 9 nicht, ABER den ganzen Fragezeichen Block. Die ganzen Fragezeichen kann ich nachher auf einmal auslesen, aber die 9 ist verschwunden, die ist nirgends dazwischen, die taucht nur auf wenn ich bereits am lauschen war. Man könnte jetzt sagen, ist ja logisch, du warst nicht am lauschen, aber wieso kann ich denn all die Fragezeichen nachträglich wieder auslesen, aber nicht die 9 die wieder zurück gesendet zwischen den Fragezeichen hätte stehen sollen? Erscheint mir vollkommen unlogisch. Genau das meinte ich jetzt im letzten Beitrag mit entbehrt jeglicher Logik, ich glaube Du hast das vielleicht nicht so aufgefasst wie ich es gemeint hatte. Das meinte ich jedenfalls.


    "Sorry, solange Du nur vage Andeutungen über Deine Aktivitäten machst und niemals ein Linux-Kommando nachvollziehbar verrätst, kann Dir hier niemand helfen. Auch wenn - wie bei mir - langjährige Erfahrungen bzgl. serielle Schnittstellenprogrammierung etabliert sind."

    Ich dachte ich hätte alles genau aufgeschrieben, das sind nicht so komplexe und vielfältige Befehle wie du unten im Script angefügt hast, da gibt es nur die 3 Sachen die ich geschrieben habe sudo stty -F /dev/ttyUSB0 raw -echo, cat /dev/ttyUSB0, echo 9 > /dev/ttyUSB0. Mehr nicht, Arduino anschliessen mit dem Code darauf den ich im Code Block angehängt hatte, und dann diese 3 Befehle.


    "Meine selbst geschriebenen Programme arbeiten fehlerfrei mit der seriellen Schnittstelle. Also funktioniert die Kommunikation zwischen Arduino und RPi prinzipiell ebenso fehlerfrei.


    Demzufolge liegt der Fehler irgendwo bei Dir und / oder Deiner Installation und / oder Konfiguration.

    Es obliegt nun Dir, uns detaillierte Informationen zur Verfügung zu stellen. Nach denen bereits mehrmals gefragt wurde. Und die benötigt werden, um die Fehlerursache soweit einzukreisen, dass Dir konkret geholfen werden kann,"


    Ja man könnte schon sagen es liegt an mir weil ich es nicht richtig verstehe, aber sieh doch oben bei dem Beispiel mit der (nicht ankommenden) 9, wie erklärst Du Dir das? Das erscheint mir als willkürliches unlogisches Verhalten, oder wo ist da die Logik? Kannst du mich da erleuchten, wieso das so ist?

    Und welche Informationen die erfragt wurden, ich hoffe spätestens jetzt sind alle Informationen mitgeteilt die erfragt wurden?


    "Code-Ausschnitt Arduino Nano R3-Kompatibel"

    Man muss vielleicht wirklich deutlich sagen, ich kann fast nichts auf dem Arduino, 80% von dem was du da schreibst verstehe ich mindestens zur Hälte nicht (ausser die reinen Serial.write(...) ). Das verstehe ich alles nicht, sorry.


    "Auf dem RPi läuft folgender Code - Ausschnitt und auf das wesentliche Verständnis gekürzt:"

    Genau das Selbe, das meiste verstehe ich nicht, diese Befehle und Zeichen verwende ich nie, ich weiss nicht was das ist. Man muss vielleicht auch hier ganz deutlich sagen: Ich verstehe nur sehr wenige Bash Befehle und Zeichen, so in etwas nur echo, sleep, cat, sed, cut, wc, grep, date, read, while ..., if then else, imagemagick. Und dann halt noch so Befehle wie awk, tail und fällt mir jetzt grad auch nicht alles ein, aber alles das was du da in den Scripten schreibst sieht für mich nur nach Sonderzeichen aus...

    Diese Befehle haben aber eigentlich immer gereicht (zusammen mit Variablen natürlich), und ich brauche eher immer weniger Befehle als mehr...


    Wenn das mit Serial NUR so komplex geht dann kann ich es sowieso vergessen. Aber den Beispielcode aus der Arduino IDE sieht noch nicht sooo extrem kompliziert aus, wenn man es denn mal versteht...


    "Natürlich funktioniert eine Kommunikation auch ohne Terminatorzeichen - mit ist es aber einfacher und sicherer."

    Ja


    "[Ähnlich verhält es sich bei der sog. Flusssteuerng (auf die ich hier mal noch gar nicht eingehen möchte). Da sollte reichen, dass beiden Seiten eine identische Flusssteuerung zugeordnet wird (oder auch keine wie in meinem Beispiel).]"

    Keine Ahnung was Flusssteuerung ist...


    "Und im LXTerminal funzt das auch:"

    Das verstehe ich auch alles zur Hälfte nicht, hat viel zu viele Optionen und Zusätze die ich nicht verstehe. Aber du erklärst es unten noch so schön, ich verstehe was du meinst, nur nicht wirklich was all die Optionen bei stty machen, ich verstehe es nicht einmal bei meinem stty Befehl richtig...

    Aber ja, so funktioniert es, wenn mit cat vorher schon gelauscht wird. Das meinte ich aber nicht, du hast mich glaube ich irgendwie nicht richtig verstanden was ich gemeint habe, es war das mit der 9 wenn ich nicht direkt mit cat am lauschen bin, wie oben geschrieben...


    Aber wenn es wirklich soo kompliziert ist mit der seriellen Kommunikation kann ich es sowieso vergessen, das sind viel zu viele Befehle und Zeichen die ich nicht verstehe...



    Beste Grüsse

  • Ich weiss gar nicht was das alles ist ausser Baudrate, normalerweise verwendete ich nur diesen einen stty Befehl um alles zu konfigurieren "sudo stty -F /dev/ttyUSB0 9600 raw -echo"

    Ich weiss nicht einmal für was das raw und -echo steht. Es hat einfach so funktioniert...

    Dann schau in den man-pages nach. < man stty >, < info stty >


    Wenn Du jeden Parameter zu jedem vorinstallierten (System-)Programm aus dem Internet erfragen musst, bist Du am Ende um 20 Jahre gealtert.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Du hast - nachdem Du den Pegel des Arduino-TX auf < 3.3 V reduziert hast - an RPI-RX angeschlossen? Solltest Du den Pegel nicht angeschlossen haben, dann ist die Wahrscheinlichkeit echt groß, dass Du mindestens den GPIORX des RPi zerlegt hast.

    Die Hardware dazu nennt sich Spannungsteiler oder Pegelwandler (5V auf 3.3 V).

    ohne Pegelwandler, simpel hat bei mir gut funktioniert!


    diese Forensuche ist eine Seuche, man findet nie was man schon ALLES mit Schaltplan gepostet hat!


    Der AVR spuckt ja 5V aus, der PI verträgt das nicht also wird

    1. der Strom durch den 470 Ohm begrenzt und

    2. alles über 3,3V bis auf die Schwellspannung nach 3,3V abgeleitet!

    Images

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)