Wenn Du structs verschickst, dann doch wahrscheinlich als binär-daten.
Irgendwie verpackt in Pakete, damit Du zumindest den Anfang von einem
Datensatz erkennst.
Wie schon gesagt wurde ist es ne schlechte Idee XML zu verschicken. XML
heißt üblicherweise du verschickst die Daten als Text und hast jede
Menge overhead für die XML-Struktur. XML wirklich parsen (damit es auch
wie gewünscht resistent gegen zukünftige Änderungen ist) willst Du mit
nem uC nicht wirklich machen.
Der Overhead von Text-Übertragung zu XML ist schon groß genug! Von RAW
nach XML ist es dann noch mehr.
Aber du kannst ja key-value paare verschicken. Die keys legst Du fest
und die sind in all deinen Programmen gleich. Die Programme reagieren
auf/versenden nur die keys, die sie benötigen/kennen. D.H. ein Sensor
verschickt vielleicht nur ein Paket mit moduleid, packetid und einem
sensor-val-1.
Ein Empfänger, der den sensor-Wert loggen soll, liest moduleid, packetid
und sensor-val-1 aus. Erkennt z.B., dass der timestamp fehlt und ergänzt
den.
Ein anderer Empfänger findet keine relevanten daten und ignoriert das
paket komplett ...
Eine Möglichkeit für den key wäre die keys in einer zentralen
Header-Datei zu pflegen. Wenn Du als key dann ein word hernimmst, hast
Du 64k verschiedene Daten, die verschickt werden können. Solltest Du
abschätzen können, ob das reicht.
Eine andere Möglichkeit wäre eine einfache Hash-Funktion dafür zu nehmen
und dann mit den Namen zu arbeiten: hash( "moduleid" ), hash(
"sensor-val-1" )
Musst natürlich aufpassen, daß dir die Hash-Funktion für 2 verschiedene
Namen nicht den gleichen Hash-Wert liefert.
Das Paket hätte dann eine variable Größe.
Für die Menge an Daten, die zu übertragen sind bedeuted das natürlich
erst mal, daß es mehr werden, da nicht nur die Daten, sondern auch die
keys übertragen werden müssen. Aber netto kann es dann sogar weniger
sein, nämlich dann, wenn viele devices die meisten Teile des structs eh
leer lassen.