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 microcom
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
[gelöst] Ersatz für "Serieller Monitor" (in Arduino-IDE)
[gelöst] Ersatz für "Serieller Monitor" (in Arduino-IDE)
Zuletzt geändert von TuxPeter am 31.01.2022 20:10:54, insgesamt 1-mal geändert.
Re: Ersatz für "Serieller Monitor" (in Arduino-IDE)
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:
In daten.txt sieht es dann z.B. so aus:
jetzt mache ich es so:
und daten2.txt sieht dann so aus:
Und add_timest.sh ist auch denkbar einfach:
Nach Auswahl des gewünschten Zeitbereiches besorgt weiteres Script besorgt dann bei Bedarf eine Formatumwandlung:
Ü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)
MfG,
TuxPeter
Bisher übernahm ich die Daten vom Arduino wie folgt:
Code: Alles auswählen
microcom -s 9600 -p /dev/ttyUSB0 > daten.txt
Code: Alles auswählen
A 150
A 200
A 250
A 300
Code: Alles auswählen
microcom -s 9600 -p /dev/ttyUSB0 | . add_timest.sh > daten2.txt
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
Code: Alles auswählen
# add_timst.sh
# Zeitstempel davor setzten
while read a; do
echo `date -Ins` $a
done
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
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