Serielle Kommunikation Arduino <-- Raspberry

Einen schönen guten Abend
an interessierte Forum-Mitglieder.

Ich bin Neu in diesem Forum und habe mein Problem durch Recherche fast gelöst.
Es geht darum, serielle Daten die ein Raspberry minutlich zu meinem Arduino Nano sendet auszuwerten um damit einen Ventilator zu regeln.
Wie ich herausgefunden habe gibt es Probleme mit dem Daten-Array.
Ich bekomme die Indexierung nicht im Griff : smiley-eek-blue:

Bin ich, bevor ich ins Detail gehe, mit meiner Anfrage hier richtig?

LG

Für den Nano-Teil, ja. Der Sender scheint ja zu funktionieren.
Wobei Du uns ein Beispiel der gesendeten Daten (incl. Steuerzeichen) schon mit angeben solltest.

Also den Sketch (in Codetags) bruchen wir und wie hast Du alles angeschlossen (am Besten ein Schaltbild)

Gruß Tommy

Lieber Tommy.

Nun ins Detail...

Zusätzliche Einträge in der Datei /etc/rc.local des Pi
#------------------Anfang ------------------

Speed Device ttyS0 auf 115 KBd festlegen

stty -F /dev/ttyS0 115200

Watch-Task zum Senden der CPU-Temp auf die serielle Schnittstelle

watch -n 1 -t "vcgencmd measure_temp | cut -c 6-9 | tr -d '.' > /dev/ttyS0
date +%d > /dev/ttyS0
date +%m > /dev/ttyS0
date +%y > /dev/ttyS0
date +%H > /dev/ttyS0
date +%M > /dev/ttyS0"
#----------------- Ende ---------------------
Jeder der gesendeten 6 Daten-Blöcke des Pi, rein numerisch
30h bis 39h wird mit einem CR am Ende abgeschickt.

518 <-- Entspricht Temperatur von 51.8 °C 1. Block
19 <-- " DD (Tag)
1 <-- " MM (Monat)
20 <-- " YY (Jahr)
14 <-- " hh (Stunde)
57 <-- " mm (Minute) 6. Block

Der Pi liefert jede Minute nachstehendes Daten-Paket (6 Blöcke)
was eine Gesamtlaufzeit von ca. 54 mS in Anspruch nimmt.
Siehe 1_Bild.jpg vom Oszi.

Je nachdem wie stark der Pi von anderen Tasks in Anspruch genommen
wird gibt es kleinere Timing-Abweichungen um ca. 10%. +/- 5mS
Anfangs wurden zu dem Nano nur die Temperatur-Daten gesendet also
immer wiederkehrende Zahlenwerte >300 <650 und über den seriellen
Plotter visualisiert. Ohne Aussetzer oder anderweitige Auffälligkeiten.

Zwischen dem Sender Pi und dem Empfänger Nano sitzt ein 3V zu 5V
Voltage-Converter TXS0102 der Schnittstellen-Pegel anpasst.
Die TX-Ausgangsdaten des Nano frage ich am Pi nicht ab. Leitung nicht
verbunden. Hoffentlich ist das kein Fehler :-?
Zum Hochladen des Sketch trenne ich kurzfristig die TX-Leitung vom
Pi zum Nano TX-Eingang (Pin 2).
Siehe 2_Bild.png
Mit Orientierung an Bild 3 u. 4. zu weitern Verdrahtung mit ca.
1 Meter Kabellänge (abgeschirmtes USB-Kabel). Die Signalflanken sind
sehr sauber.

Mein Sketch ist in ein Bereich --Programm--A-- und --Programm--B--
aufgeteilt. Es ist aber nur A oder B aktiv. Nur der Code ist unter-
schiedlich. B ist eine Weiterentwicklung von A

Zum eigentlichen. Problem :
Mein Sketch liefert mir bei der Ausgabe am Monitor kurzzeitig einen
Datenversatz, sprich fehlerhafte Zuordnung des 1. Blocks, alle anderen
Blöcke scheinen versetzt zugeordnet zu sein. Nach so ca. 10 Packet
übertragungen sind sie aber synchron!
Siehe Sketch sketch_jan19f_Pi_Transmit_Data_to_Nano.ino

Da ich die Schreibweise Serial.print(" Temp : "); Serial.println(Temp);
als bequem und besser lesbar finde möchte ich das array[] in der
void Read_RX Routine auslesen und den globalen Variablem Temp
bis mm zuordnen, wie im --Programm--B-- Bereich geschehen.
Vermutlich steckt das Detail im Hochzählen des Index-Zählers!
Was mache ich hier verkehrt?

Ich bin kein guter C++ Kenner und würde mich freuen wenn deine
Hilfe nicht mit einem einzigen Satzkommentar erfolgt. Bitte in das
Progamm schreiben.

Herzlichen Dank
Wolf

4_Bild.png

3_Bild.png

sketch_jan19f_Pi_Transmit_Data_to_Nano.ino (4.19 KB)

Ich hatte Dich gebeten, den Code in Codetags zu setzen (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *), als Anhang haben es mobile Leser schwerer.
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Edit:
Das scheint mir erst mal nicht eindeutig zu sein:

518   <-- Entspricht Temperatur von 51.8 °C    1. Block
19     <--     "      DD (Tag)
1       <--     "      MM (Monat)
20     <--     "      YY (Jahr)
14     <--     "      hh (Stunde)
57     <--     "      mm (Minute)                            6. Block

Bei 2-stelligem Monat wird das Format länger. Also entweder feste Längen oder Trennzeichen.

Hallo,

warum schreibst Du nicht alles in eine Zeile und verwendest ein Trennzeichen Deiner Wahl (z.B ;-,). Am ende ist dann ein CR damit kannst Du die gesamte Zeile in in char Array einlesen und dann wieder trennen (c-string verarbeiten) Unsychron gibts dann so ehr nicht mehr.

z.B 518;19;1;20;19;56;30

Heinz

Hallo Heinz,

date +%d.%m.%Y >> /dev/ttyS0 in der rc.local

würde alles verkürzen. Das Trennzeichen wären ein Punkt.
Werde mich die Tage wieder melden.

Dankeschön
Wolf