Lesen/Parsen eines seriellen Inputs

Vulpecula

Commander
Registriert
Nov. 2007
Beiträge
2.241
Hallo zusammen!

Ich habe hier ein Arduino-Projekt am Wickel, welches nun auch eine etwas aufwändigere grafische Ausgabe bekommen soll.
Konkret bedeutet dies, dass der Arduino via serieller Schnittstelle diverse Werte liefert, die ich nun parsen muss, bevor sie dann weiterverarbeitet werden. Im Moment habe ich noch keinen konkreten Code, sondern bin viel mehr am überlegen, wie ich das jetzt möglichst adäquat umsetze.

Code:
TEMPERATURE SENSORS
- Motor: 12°C
- Amplifier: 34°C

ENVIROMENTAL SENSOR
- Temperature: 12.3°C
- Humidity: 45.6 %RH
- Barometric Pressure: 7890hPa

BATTERY MONITOR
- Voltage 1: 12.3V
- Voltage 2: 45.6V
- Voltage 3: 78.9V
- Voltage 4: 12.3V
- Voltage 5: 45.6V
- Power: 7890W

COUNTDOWN TIMER
- Status: Active
- Program: 15 Minutes
- Remainung Time: 12:34

Mir schwebt eine Lösung vor, bei der ich innerhalb des Arduinos einen String zusammensetze, ungefähr so: ID + Delimiter + SUB_ID + Delimiter + Wert. Konkret würde dann z.B. folgender String übertragen werden: DS18B20#Motor#12. Das Ganze würde ich dann im Programmablauf selbst via RegEx wieder auseinanderpflücken und dementsprechend weiterverarbeiten.

Ich könnte natürlich auch alle Werte in einen riesigen String schmeißen und dann mit RegEx kommen. Allerdings habe ich nicht für alle Werte die gleiche Updatefrequenz (den Klimasensor lese ich z.B. nur einmal die Sekunde aus; häufiger ist schlicht nicht nötig). Wenn ich die Werte einzeln verpacke und rausschicke, brauche ich sie tatsächlich nur dann senden, wenn auch eine Änderung vorliegt; ergo weniger Stress auf dem Arduino. (Da muss ich unter anderem noch einen RFID-Chip pollen und ggf. einen Tag auslesen, was schon ziemlich ätzend ist). Die Last auf der Seite des Computers macht mir weniger sorgen.

Aber: Dies ist das erste Mal, dass ich Daten von einem Arduino via Serial rausschicken und in einem eigenen Programm weiterverarbeiten will und vielleicht hat ja schon jemand Erfahrungen diesbezüglich sammeln können, die er mit mir teilen mag.

Grüße,
Vulpecula

P.S.: Ich werde das Ganze in Java umsetzen, da ich hier bereits Erfahrung mit der RXTX Library und dem jSSC habe. Sobald das erledigt ist, kippe ich eine nette JavaFX GUI drauf. Qt bleibt eine Option, allerdings müsste ich mich da erst einarbeiten.
 
Bastel die Informationen doch in einen JSON-String und übertrag den. Deutlich einfacher, als dir selbst eine Syntax auszuknobeln und zu parsen. Ich programmiere nicht mit Java und schon gar nicht mit dem Arduino, hab bei goggel aber ein ähnliches Thema gefunden, bei dem eben JSON verwendet wird: Klick!

Vermutlich gibt's für Java bereits eine Bibliothek, die mit JSON umgehen kann, und sonst gibt es im www sicherlich Hunderte fertige Codeschnipsel ;)

*edit
JSON @ Java
 
  • Gefällt mir
Reaktionen: Vulpecula, Hayda Ministral und Madman1209
  • Gefällt mir
Reaktionen: Vulpecula und Madman1209
Wie schon gesagt würde ich auf auf JSON setzten, ist genau für sowas gemacht. Wenn die Datenmenge für JSON zu groß ist, könnte man noch überlegen ob MessagePack eine Option wäre (Nur wenn es Bibliotheken dafür gibt).
 
  • Gefällt mir
Reaktionen: Vulpecula
Ja, JSON sieht interessant aus. Zumindest das Erstellen von JSON Objekten auf dem Arduino ist relativ simpel.

Ich habe leider noch nie was mit JSON gemacht... ergo muss ich mir mal ansehen, wie diese Objekte via Serial-Port in Java ankommen und wie ich die dann weiterverarbeiten kann. Immerhin gibt es schon viele fertige APIs dafür. Vielen Dank für den Tipp! :daumen:
 
Hi,

das ist das gängigste Mittel, wenn es um sowas geht. Da gibt es sicher was (fast) fertiges für den Anwendungsfall :)

VG,
Mad
 
  • Gefällt mir
Reaktionen: Vulpecula
JSON-Objekte werden ganz banal als String übertragen. Das was du oben also selbst definiert hast, ersetzt du einfach durch einen JSON-String.
Je nachdem was für Sensoren du hast, sprechen die vielleicht sogar selbst JSON ;)
 
  • Gefällt mir
Reaktionen: Vulpecula
Hi,

gibt für Arduino auf alle Fälle jede Menge Libs, die sich um JSON Decode und Encode kümmern :)

VG,
Mad
 
  • Gefällt mir
Reaktionen: Vulpecula
@Raijin: Nein, die Sensoren können leider kein JSON. Also nicht, dass ich wüsste.

@Madman1209: Japp, eine LIB, die JSON rausspuckt habe ich schon gefunden. Klappt soweit auch ganz gut. Jetzt muss ich nur noch das "deserialize" (?) auf der Java Seite hinbekommen. Werd mich am WE mal etwas ausgiebiger damit beschäftigen.
 
Hi Vulpecula,

erstmal musst Du ja die serielle Schnittstelle, die wahrscheinlich ein Serial-USB-Converter ist, mit den richtigen Parametern öffnen, die Du auch am Arduino für die Ausgabe eingestellt hast. Die ordentliche und zuverlässige Kontrolle der Schnittstelle halte ich für wesentlich wichtiger als irgendwelche Umwandlungen von Strings in ander Strings. Ich mach das so, dass ich mit einem "Port-programm" (in C++/Qt mit Qt-Serial - ist vielleicht viel einfacher als mit Java) auf dem Rechner am Arduino den USB/Serial-Port auslese und das Resultat kontinuierlich und tabellarisch in ein leicht weiterzubearbeitendes Textfile schreibe, welches ich dann mit allen möglichen Tools (JS, Webserver, JSON etc.) verwenden kann.

Ausserdem könntest Du in Arduino-C die Daten schon beim erfassen ein bisschen vorformatieren und den Mist, den Du nicht brauchst, weglassen.
 
blöderidiot schrieb:
Ich mach das so, dass ich mit einem "Port-programm" (in C++/Qt mit Qt-Serial - ist vielleicht viel einfacher als mit Java) auf dem Rechner am Arduino den USB/Serial-Port auslese und das Resultat kontinuierlich und tabellarisch in ein leicht weiterzubearbeitendes Textfile schreibe, welches ich dann mit allen möglichen Tools (JS, Webserver, JSON etc.) verwenden kann.

Vielen Dank für Deine Antwort. Wenn ich das richtig verstehe, dann schlägst Du vor, das ganze zwischenzuspeichern. Allerdings wäre für mich der Umweg über ein Logfile o.ä. nur dann eine Option, wenn es gar nicht anders geht. Mein Wunsch ist es, dass die Daten quasi in "Echtzeit" (ja... ist es nicht ganz, weiß ich ;)) zur Verfügung stehen und später auf einer Oberfläche angezeigt werden (z.B. einen Bargraph für die Spannungen oder sowas).

Ehrlich gesagt würde ich auch lieber mit Qt arbeiten, allerdings komme ich momentan in Java besser zurecht und habe schon mit APIs für Serielle Schnittstellen (RXTX, jSSC) gearbeitet (z.B. um Daten von einem Arduino in eine InfluxDB reinzuschreiben).


blöderidiot schrieb:
Ausserdem könntest Du in Arduino-C die Daten schon beim erfassen ein bisschen vorformatieren und den Mist, den Du nicht brauchst, weglassen.

Das ist sowieso schon der Fall bzw. ich bin frei, die Ausgabe des Arduino an meine Bedürfnisse anzupassen.
 

Ähnliche Themen

Zurück
Oben