[gelöst] Ersatz für "Serieller Monitor" (in Arduino-IDE)

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
TuxPeter
Beiträge: 1954
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

[gelöst] Ersatz für "Serieller Monitor" (in Arduino-IDE)

Beitrag von TuxPeter » 29.01.2022 13:20:26

Hi,

über den sog. "Seriellen Monitor" der Arduino-IDE kann man über den USB-Anschluss Daten empfangen und senden.
Das geht natürlich auch anders, z.B. mit Debianmicrocom

Großer Vorteil: Ich kann die empfangenen Daten gleich in ein File umleiten und muss sie nicht erst per copy&paste aus dem IDE-Fenster herausfummeln.

1. Nachteil. Die Arduino-IDE kann einen Zeitstempel zu den empf. Daten setzen. Der muss später zwar erst mühsam umformatiert werden, ist aber sonst sehr brauchbar. (Aber erst, nachdem ich - der Zeitstempel wird mit 1/1000 sec geliefert - herausbekommen habe, wie ich den sich daraus ergebenden Zahlenüberlauf in der bash handeln kann)

Ich habe leider keine Ahnung, wie ich einen solchen Zeitstempel (am liebsten gleich in 1/10 oder 1/100 sec beim Empfang der Daten in einem Terminal hinzufügen kann.

2. Problem. Der Ser. Monitor wartet bei der Eingabe auf Return. microcom sendet jedes Byte sofort, man müsste somit bestimmte Eingaben erst im µP zusammenbasteln - aufwendig, und nicht mehr kompatibel zur IDE.

Hat jemand eine Idee, ob man eventuell irgendwie diese beiden Probleme umgehen kann?

MfG
TuxPeter
Zuletzt geändert von TuxPeter am 31.01.2022 20:10:54, insgesamt 1-mal geändert.

TuxPeter
Beiträge: 1954
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: Ersatz für "Serieller Monitor" (in Arduino-IDE)

Beitrag von TuxPeter » 31.01.2022 20:09:55

Nachdem es wohl keine Möglichkeit gibt, den gewünschten Zeitstempel automatisch einzufügen, bin ich auf die an sich sehr simple Idee gekommen, die per "Pipe" zu erzeugen.
Bisher übernahm ich die Daten vom Arduino wie folgt:

Code: Alles auswählen

microcom -s 9600 -p /dev/ttyUSB0 > daten.txt 
In daten.txt sieht es dann z.B. so aus:

Code: Alles auswählen

A 150
A 200
A 250
A 300
jetzt mache ich es so:

Code: Alles auswählen

microcom -s 9600 -p /dev/ttyUSB0 | . add_timest.sh > daten2.txt
und daten2.txt sieht dann so aus:

Code: Alles auswählen

2022-01-31T19:41:37,898724136+01:00 A 150
2022-01-31T19:41:37,949009085+01:00 A 200
2022-01-31T19:41:37,998965823+01:00 A 250
2022-01-31T19:41:38,049472143+01:00 A 300
Und add_timest.sh ist auch denkbar einfach:

Code: Alles auswählen

# add_timst.sh
# Zeitstempel davor setzten
while read a; do
   echo `date -Ins` $a
 done
Nach Auswahl des gewünschten Zeitbereiches besorgt weiteres Script besorgt dann bei Bedarf eine Formatumwandlung:

Code: Alles auswählen

# timest_bash.sh
# Arduino-Serial-out mit Zeitstempel verarbeiten
# hat das Format :
# 2022-01-31T11:29:29,303375062+01:00 Werte_vom_Arduino 
#          $a                                                                 $wert
#############  Funktions-Ergebnis auf $ausg ############
function umwandeln {
#   nimmt führende 0 als Oktalwert, deshalb h - m - s - ms extra verarbeiten!!
#   Präfix für dez. = 10#irgendwas
#    Stunden
       let h=10#${a:11:2}
#    echo h=$h
#    Minuten
       let m=10#${a:14:2}
#    echo m=$m 
#    Sekunden
       let s=10#${a:17:2}
#    echo s=$s
#    msecec
      let msec=10#${a:20:3}
 #   echo msec=$msec
 #   alles auf msecec - besteht 
     let ausg=msec+s*1000+m*60*1000+h*60*60*1000	
 #    oder auf 1/100-sec
#    let ausg=msec/10+s*100+m*60*100+h*60*60*100
 #    auf  1/10-sec
#     let ausg=msec/100+s*10+m*60*10+h*60*60*10
 }
###########################################

# 1. Wert Lesen und auswerten
read a wert
umwandeln
# erster Wert als Startwert, wird fortan abgezogen
let first_ausg=$ausg
# und wir wollen 1. Wert auch sehen - Timestamp sollte 0 sein
echo $(($ausg - $first_ausg )) $wert

while read a wert; do
       umwandeln
        let ausg=$ausg-$first_ausg 
        echo $ausg $wert
 done
Übrigens: wollte das gerade nach nopaste packen - hat aber irgendwie nicht funktioniert. Außerdem steht das alles jetzt wohl unter der falschen Rubrik - hoffe das stört keinen.
Jedenfalls hat der ausgewählte Bereich jetzt einen fortlaufenden Zeitmarkierung, in dem Fall in millisec. (Das Testprogramm im µP erzeugt alle 50 msec eine Ausgabe, ist jetzt natürlich so in dieser Art sinnfrei, zeigt aber, dass es funktioniert)

Code: Alles auswählen

0 A 150
51 A 200
100 A 250
151 A 300
201 A 350 

MfG,
TuxPeter

Antworten