Jan H. schrieb:> Wie sendet man sinnvoll jetzt solch eine Struktur?
So wie es der Empfänger braucht. Im einfachsten Fall einen Zeuger auf
das erste Byte, und die Länge angeben.
Was soll das denn werden?
Jan H. schrieb:> Was hat sich bis jetzt so bewährt?
Es hat sich bewährt daß man sich stets dessen bewußt sein muß daß es
verschiedene Endianness und verschiedene Alignmentregeln gibt und das
nicht dem Zufall überlässt sondern aufs Bit genau festnagelt und
dokumentiert und sicherstellt daß das dann auch so bleibt. Dazu sind
dann ein paar mehr Maßnahmen zu beachten als einfach nur blind ein
Struct byteweise auszugeben und auf das beste zu hoffen.
Das erste was mir bei Deinem struct schon mal auffällt ist daß die
Elemente nicht ordentlich an ihren self-alignment-Grenzen ausgerichtet
sind und daher Padding erzwingt und noch dazu auf unterschiedlichen
Plattformen möglicherweise unterschiedlich viel davon.
Naj H. schrieb:> wie man sowas am besten macht.
Das kommt auf den konkreten Anwendungsfall an.
Ich tendiere Dazu, Daten in menschen-lesbarer Form zu übermitteln. CSV,
JSON, XML oder ähnliche Datenformate nutze ich sehr gerne, weil ich sie
gut mitlesen und manuell simulieren kann.
Binär ist natürlich kompakter. Vielleicht brauchst du Prüfsummen oder
Handshake.
Bernd K. schrieb:> Jan H. schrieb:>> Was hat sich bis jetzt so bewährt?>> Es hat sich bewährt daß man sich stets dessen bewußt sein muß daß es> verschiedene Endianness und verschiedene Alignmentregeln gibt und das> nicht dem Zufall überlässt sondern aufs Bit genau festnagelt und> dokumentiert und sicherstellt daß das dann auch so bleibt. Dazu sind> dann ein paar mehr Maßnahmen zu beachten als einfach nur blind ein> Struct byteweise auszugeben und auf das beste zu hoffen.
Wie wäre es denn Sinnvoller?
Ein Beispiel wäre nett ;)
Jan H. schrieb:> Was hat sich bis jetzt so bewährt?
Es ist wichtig die Grenze der einzelnen Datenpakete sicher zu erkennen.
Das geht entweder mit einer definierte Pause die über einen Timeout
erkannt wird oder über Framing.
Bei mir bewährt hat sich:
https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing
Immer nur 1 Byte Overhead und sichere Erkennung der Paketgrenzen.
Vorschlag:
- Daten binär verpacken (evtl. _attribute_ ((packed)) benutzen)
- Checksumme anhängen
- COBS-encodieren
Wenn das portabel sein soll und auf anderen als vorher geplanten
Maschinen laufen soll ist noch die
https://en.wikipedia.org/wiki/Endianness
zu beachten.
Grüße, Brt
Stefanus F. schrieb:> Naj H. schrieb:>> wie man sowas am besten macht.>> Das kommt auf den konkreten Anwendungsfall an.>> Ich tendiere Dazu, Daten in menschen-lesbarer Form zu übermitteln. CSV,> JSON, XML oder ähnliche Datenformate nutze ich sehr gerne, weil ich sie> gut mitlesen und manuell simulieren kann.>> Binär ist natürlich kompakter. Vielleicht brauchst du Prüfsummen oder> Handshake.
Ich meinte spezielle wie ich die Bytes aus der Struktur hole bzw. von
der Adresse und dem UART übergebe.
> Wie sendet man sinnvoll jetzt solch eine Struktur?
So, dass der Empfänger es auch versteht und er außerdem noch die
Möglichkeit hat, Übertragungsfehler zu erkennen und ggf zu reparieren.
Gern benutzt wird ein ASCII-Format, ein Datensatz pro Zeile, vorne eine
Kennung um was für einen Typ von Daten es sich handelt, dann die Daten,
dann ein Zeilenende. Beispiel: "Filter 123 1,2,3,4,5,6,7,8,9,10
23423424\n". Evtl noch ein paar definierte Timeouts und ne Prüfsumme,
dann man hat was Solides.
Einfach die Daten binär roh rauszuhauen erscheint erstmal einfach, ist
aber sehr Fehleranfällig (z.B. geht nur ein Byte verloren oder durch
eine Störung ein Byte zuviel, kommen beide Seiten nie wieder in Sync)
und es ist kaum noch erweiterbar.
Naj H. schrieb:> Wie sendet man sinnvoll jetzt solch eine Struktur?
Aufgrund von Padding nicht sinnvoll auf die dargestellte Weise.
Man kann offsetof() und sizeof() auf die Elemente ansetzen. Beschreibt
man dann jedes Element als sizeof()/offsetof() Pärchen z.B. in einem
Array, kann man sich eine generische Funktion bauen, die Strukturen
"verschicken" kann.
Dummerweise gibt's auch noch die Endianness, die in diesem Beispiel
ignoriert wird. Für eine richtige Lösung, sollte man diese natürlich
berücksichtigen.