Serielle Kommunikation über TX und RX Pin funktioniert nicht

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

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

    Ja ok, habe es jetzt nachgeschaut und sogar verstanden. Sieht so aus als ob das nur Optionen sind um irgend welche Sonderzeichen zu ignorieren, was ja eigentlich nicht einmal von Vorteil ist wenn ich selbst nicht einmal weiss dass das so gemacht wird.

    Und danke jar für den Beitrag, sieht Hilfreich aus...


    Ich habe es jetzt sogar hinbekommen dass ich sogar zum Arduino über die GPIO's senden kann, aber lesen geht irgendwie immer noch nicht.

    Es hat mich wunder genommen ob ich denn 2 Arduinos über rx tx miteinander verbinden kann, und sogar gesehen das es geht, ABER nur ohne Widerstände, oder nicht grösser als ca 600 Ohm. Weiss vielleicht jemand ob das in Ordnung ist wenn ich 2 Arduinos einfach bei den Rx Tx pins sozusagen kurzschliesse und ohne Widerstand direkt verbinde? Der 2. Arduino bekommt dann irgendwie etwas Strom über den Tx Pin, es leuchten schon 2 LED's ganz schwach bevor ich ihn an den Strom angeschlossen habe über USB, macht das so nichts?

    Jedenfalls ging es, also habe ich mal vom Raspberry Pi Zero 2, den Tx Pin direkt mit dem Arduino verbunden. Ich hoffe, das ist so auch in Ordnung und es geht nichts kaputt?

    Ausserdem ist mir aufgefallen dass auf dem Pi 0 2 /dev/ttyS0 sich so verhält wie ttyUSB0, ein cat /dev/ttyS0 gibt ein endloses lesendes cat, und ein echo sendet halt kurz. ttyAMA0 verhält sich aber anders, cat bleibt so nicht endlos (also der Befehl wurde abgeschlossen), und ein echo dahin ergibt eine komische endlose leere Ausgabe, die ich nur beenden konnte mit einem Neustart. Also versuchte ich mit stty -F /dev/ttyS0 9600 diese Datei zu nutzen (was eigentlich auch ein logischer Vorgang gewesen wäre, das ich aber vergessen hatte bevor ich den ersten Beitrag hier geschrieben hatte).

    Und so hat dann ein echo 1 > /dev/ttyS0 auch eine 1 zum Arduino gesendet (die genau gesagt als 49 am Arduino ankommt, weil es ja irgendwie in Zahlen umgewandelt wird. ist irgendwo aufgezeichnet in einer Ascii Tabelle im Google).

    Also es hat funktioniert, und ich habe durch testen herausgefunden dass 700 Ohm Widerstände schon zu viel sind und der Arduino selbst kein Signal mehr empfängt, 600 Ohm geht dann wieder. Wieso dass dann in allen Tutorials immer solche Widerstände um die 1, 2K Ohm verwendet werden weiss ich auch nicht, (Benutzer) jar scheint mit seinem letzten Beitrag den richtigen Widerstand genommen zu haben (Dioden habe ich leider grad nicht hier).

    Also habe ich dann für den Rx Pin am Pi 0 2 einen Spannungsteiler aus 330 und 220 Ohm gemacht, aber das hat nicht funktioniert und cat hat nichts gesehen, NACHDEM ich echo 1 gesendet hatte (hoffe das ist auch in Ordnung so tiefe Widerstände an den GPIO's).

    Jedoch habe ich dann (am Pi Zero rev 1.3) mit 500 Ohm den Rx Tx Pin überbrückt (wie fred 0815 geschrieben hatte), und genau das gleiche, ausser Ich "lauere" zuerst mit cat, und sende während dem ich am lauschen bin ein echo, dann passiert etwas komisches, es startet eine endlose Ausgabe von Leerzeilen, mit am Anfang ein paar mal 1 dazwischen. Keine Ahnung was das soll, das sieht mir jetzt irgendwie nach ECHOing aus von dem Andreas geschrieben hat.

    Ich frage mich jetzt ob der Widerstand dieses seltsame Verhalten verursacht (neben dem seltsamen Verhalten dass ich zuerst lauschen muss bevor ein echo gesendet wird). Kann ich den Rx und Tx Pin von allen Pi's kurzschliessen und direkt ohne Widerstand miteinander verbinden? Oder geht dann etwas kaputt?

    Ausserdem hatte ich irgendwann kurz am falschen Ort eingesteckt und 4.7V in den RX Pin des Pi Zero 2 gelassen -.- ... Jetzt frage ich mich woher ich weiss dass dieser Pin noch funktioniert oder nicht? Er verhält sich genau gleich wie am Pi Zero rev 1.3, wenn ich ihn als GPIO input Pin benutze, liegen 3.3 Volt an diesem Pin, und /sys/class/gpio/gpio15/value ist 1, als output Pin wird er 0v. Kann man irgendwie herausfinden ob der Rx Pin am Pi 0 2 jetzt noch normal funktioniert?

    Ich habe dann am Pi Zero rev 1.3 weiter gemacht, bei dem gibt es aber ttyS0 nicht, nur AMA0, und mit AMA0 hat es auch funktioniert. (Bei beiden Pi's ist im raspi-config diese Option ausgewählt, das so etwas wie Konsole über Serial deaktiviert wird und Hardware Serial aktiviert ist).

  • Serielle Kommunikation über TX und RX Pin funktioniert nicht? Schau mal ob du hier fündig wirst!

  • Wenn du deinen Pin kontrolliert hast kannst du folgendes Script testen.

    Das '/dev/ttyACM0' musst du an deine Gegebenheiten anpassen sowie die Baudrate.

  • Also habe ich dann für den Rx Pin am Pi 0 2 einen Spannungsteiler aus 330 und 220 Ohm gemacht

    Rx steht für receive, wenn ich richtig gerechnet habe müsste der sendende AVR über Tx rund 10mA auf die beiden zusammen 550 Ohm treiben.

    bissel viel,

    1mA bis 5mA würden ja auch reichen.

    aber nun gut, bedenke das alle Signale als negative Logik kommen!

    beim PI ist der Ruhepegel 3,3V und mehr als 3mA sollte man nicht saugen (hat ja noch mehr Pins die Strom liefern sollen)

    beim AVR ist der Ruhepegel 5V und mehr als 12mA sollte man nicht saugen (hat ja noch mehr Pins die Strom liefern sollen)

    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)

  • Zitat

    Wenn du deinen Pin kontrolliert hast kannst du folgendes Script testen.

    Das hat sogar funktioniert, nachdem ich pip und mit pip pyserial installiert habe. Und sogar mit dem 1.5k und 3k Ohm Widerstand vom Arduino TX zu Pi RX.

    Also habe ich es nochmals mit cat probiert, und herausgefunden dass bei stty doch die Optionen raw und -echo angegeben sein müssen (oder mindestens eines von beiden). Wahrscheinlich filtern diese Optionen eben alles das wiederholende heraus. Und jetzt funktioniert es sogar wirklich ganz :)

    Juhu, hätte nicht gedacht dass das noch etwas wird mit Serial... Es bleibt zwar leider an allen Ecken ein unlogisches Verhalten (über die GPIO's mit ttyS0 verpasse ich jetzt das vom Arduino gesendete wenn ich nicht schon mit cat am lauschen war, über USB kann ich halbwegs die Hälfte nachträglich abrufen, und nach dem Python Script funktioniert cat nicht mehr bis ich nochmals mit stty konfiguriert habe), aber immerhin funktioniert es jetzt auf den Pi Zero's wieder genau so wie es jetzt ist...

    Und zu (Benutzer) jar noch:

    Nur von Arduino zu Arduino messe ich ohne Widerstände mit meinem Multimeter nur max 0.15mA, aber ob mein Multimeter das wirklich auch nur halbwegs genau messen kann weiss ich nicht, es ist halt ein schwankender Strom, vielleicht gibt es da kurze viel grössere Impulse.

    Aber zum Raspberry Pi geht es ja irgendwie mit über 1k Ohm Widerstände an den Rx Pin, also immerhin geht das...

    Danke allen vielmals für die Hilfe.

    Wenn irgend jemand noch wüsste, wie ich ohne dauernd mit cat am lauschen zu sein müssen, mit nur einem endenden (cat) Befehl das erhaltene auf dem Pi von tty nachträglich auslesen kann, ohne Umwege über eine andere Datei, dann wäre das phantastisch. Aber es funktioniert auch so. Danke jedenfalls für die Hilfe

  • Wenn irgend jemand noch wüsste, wie ich ohne dauernd mit cat am lauschen zu sein müssen, mit nur einem endenden (cat) Befehl das erhaltene auf dem Pi von tty nachträglich auslesen kann, ohne Umwege über eine andere Datei, dann wäre das phantastisch.

    Wie wäre es mit "minicom" (nicht vorinstalliert)?

    Servus !

    RTFM = Read The Factory Manual, oder so

  • Zitat

    Wie wäre es mit "minicom" (nicht vorinstalliert)?

    Das hat irgendwie nicht funktioniert... Habe zuerst in der manpage nachgesehen, dann gegooglet, und bin auf den Befehl minicom -o -D /dev/ttyUSB0 gestossen, aber mit dem kommt nichts heraus aus tty, und ausserdem geht es ca 0.5s bis der Befehl wieder beendet ist, das wäre viel zu lange, ich dachte schon neben dem praktischen her wegen der Geschwindigkeit ohne Umwege über eine Datei, damit ich es gleich in einer Variable habe.

    Habe dann aber noch etwas gegooglet, und bin auf head gestossen, was eigentlich auch logisch erscheint (weiss nicht wieso ich das nicht schon lange benützt habe, vielleicht hat es in der Vergangenheit einfach nicht funktioniert). Das gute an head ist sogar, dass wenn man zB. auf 10 Zeichen wartet, der Befehl nicht zuende ist bis 10 Zeichen gekommen sind, also man könnte sozusagen warten auf die nächsten X Zeichen, und hat sie dann sofort in einer Variable mit var1="$(head -c 10 /dev/ttyUSB0)". Das blöde im Gegensatz zu einem cat im Hintergrund ist dass man wenn aus versehen nicht alle Zeichen ankommen, im Befehl gefangen ist, und nicht mehr heraus kommt. Aber ich habe noch etwas weiter gegoogelt, und bin auf timeout gestossen, blöderweise werden alle schon eingetroffenen Zeichen entfernt wenn durch timeout abgebrochen wird. Aber dennoch kann head eine gute Ergänzung zu cat sein, finde ich.

    Blöd ist nur, das über die TX RX Pins head auch nicht funktioniert, wenn ich nicht vorher schon am lauschen bin, bevor überhaupt etwas gesendet wird, weil es irgendwie nichts zwischenspeichert, ist man nicht am lauschen bevor etwas über die Pins gesendet wird ist das irgendwie verloren, es speichert es nur über USB, und so nützt ein head auch wieder nichts...

    Weiss hier vielleicht irgend jemand wieso das so ist und wie ich es erreiche dass das was vom Arduino an den Pi über den TX Pin gesendet wird auch zwischengespeichert wird, so dass ich nicht schon vorher am lauschen sein muss mit cat (oder auch head), bevor überhaupt etwas gesendet wurde? (Ist zwar nicht mehr so wichtig, Hauptsache es geht irgendwie mit cat).

  • Also ich wiederhole nochmals für mich selbst (für andere kann ich das leider nicht empfehlen, da ich nicht weiss ob das mit den Widerständen so schaden kann, und weil nach anderen Tutorials noch mehr Dateien geändert werden müssen...).

    1. raspi-config den Punkt mit Serial auswählen, und Serial über Konsole (oder so ähnlich) deaktivieren und Hardware Serial aktivieren. (Habe es nicht ohne ausprobiert).
    2. Arduino RX zu TX Raspberry Pi ohne, oder mit 500 - max 600 Ohm Widerstand ( KEINE AHNUNG OB DAS SCHÄDLICH IST )
    3. Arduino TX zu RX Raspberry Pi mit Spannungsteiler, zB. 1.5k Ohm und am besten < 3k Ohm Widerstand, verbinden
    4. Arduino Ground zu Raspberry Pi Ground verbinden
    5. stty -F /dev/ttyXXX 9600 raw -echo am Raspberry Pi Zero 1 rev 1.3 ohne Wlan und Bluetooth zu /dev/ttyAMA0, und am Pi Zero 2 mit Wlan und Bluetooth zu /dev/ttyS0
    6. cat /dev/ttyXXX & oder head -c 5 /dev/ttyXXX oder timeout 10s head -c 5 /dev/ttyXXX. Zu beachten ist das head nicht endet bevor alle Zeichen erhalten wurden, und wenn mit timeout abgebrochen wird alle schon erhaltenen Zeichen gelöscht werden.
    7. Und wenn etwas gesendet werden will zum Arduino: echo "123" > /dev/ttyXXX oder printf "123" > /dev/ttyXXX . Mit echo hat es immer am Schluss eine Leerzeile (oder so etwas), und mit printf NICHT.

    Ausserdem wird (bei mir jetzt) über die TX und RX Pins nichts ge-buffert am Raspberry Pi, und auch über USB hat es nur unbrauchbar die Hälfte gebuffert. Man muss also schon vorher mit cat oder etwas am lauschen sein, bevor etwas zum Raspberry Pi gesendet wird.

    3 Mal editiert, zuletzt von ka111 (27. April 2022 um 22:02)

Jetzt mitmachen!

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