Serialisierung ist etwas, das Sie ganz einfach denken würde auf den ersten Blick, aber wie einige der commen dort bemerkt haben, sind durchaus ein paar Details, die zu benötigen in Betracht gezogen werden. Endianness ist wichtig, aber Sie müssen auch wissen, wie der Compiler die Daten innerhalb Ihrer Strukturen organisiert. Compiler tendieren dazu, Ihre Daten so im Speicher abzugleichen, dass die Zeit zum Lesen/Schreiben der Daten minimiert wird. 16/32/64-Bit-Prozessoren verfügen über Maschinenbefehle, die auf mehrere Datenbytes gleichzeitig zugreifen (z. B. zum Hinzufügen von zwei 32-Bit-Eingängen usw.). Dazu muss der Speicher, auf den zugegriffen wird, so ausgerichtet werden Sinn. Befehle, die auf Bytes zugreifen, können irgendeine Adresse verwenden, Befehle, die auf 16-Bit-Wörter zugreifen, erfordern, dass sie an geraden Adressen liegen, Befehle, die auf 32-Bit-Doppelwörter zugreifen, müssen an Adressen liegen, die durch 4 teilbar sind, und so weiter. Hinzu kommt die Tatsache, dass viele der Standardtypen in C unterschiedliche Breiten auf verschiedenen Plattformen haben können und Sie die Breite dieses Themas zu schätzen wissen.
Zumindest müssen Sie wirklich ein rudimentäres Protokoll definieren, das genau beschreibt, wie die fragliche Struktur serialisiert wird. Verschiedene Mikros und/oder Compiler können Daten auf verschiedene Arten speichern. Wenn Sie möchten, dass Ihr Code sogar leicht portierbar ist, sollten Sie vermeiden, dass Sie Ihre Daten einfach in einen Puffer verschieben. Sie haben in einem Kommentar erwähnt, dass die Sende- und Empfangsgeräte den gleichen Mikrocontroller verwenden, also könnten Sie im Prinzip mit einer naiven Implementierung davonkommen. Aber wie ich es sehe, werden Sie bereits etwas Arbeit machen, um die naive Serialisierung zu implementieren, also sollten Sie sich die Zeit nehmen, eine wohldefinierte Serialisierung zu erhalten. Chancen sind es wird Sie vor Kopfschmerzen später speichern, wenn Sie überprüfen möchten, dass Ihre Bits alle an ihre richtigen Standorte kommen. Es wird Ihnen auch ersparen, eine möglicherweise große Anzahl von ungenutzten Padding-Bits zu übertragen (siehe 2. Link unten).
Sie sollten sich diese SO-Frage zur Serialisierung ansehen: (C - serialization techniques). Es gibt ein paar verschiedene Antworten, aber die angenommene Antwort ist ziemlich genau das, was ich vorschlagen würde. Solange Sie die Größe Ihrer Strukturen kennen, können Sie ohne die dynamische Speicherzuweisung für den Puffer auskommen, aber eine dedizierte Funktion "serialize _...()" für jedes Datenobjekt ist eine gute Route.
Ich empfehle Ihnen auch, dieses Dokument zu lesen: (http://www.catb.org/esr/structure-packing/). Es soll zeigen, wie man Struct Packing benutzt, um Speicher zu sparen, aber es ist auch eine gute Quelle, um zu verstehen, wie man Daten in C serialisiert (die Subjekte sind stark verwandt).
Vor ein paar Jahren musste ich mein eigenes kleines serielles Protokoll rollen, damit einige 8-Bit-PICs über GPIOs miteinander kommunizieren konnten, und ich fand es lustig, Start-Stopp-Bedingungen und ein einfaches zu definieren Datenprotokoll.Ein ziemlich üblicher Ansatz besteht darin, Start/Stop-Bytes für Ihr Paket zu haben, und dann beschreiben Sie Ihre Daten in einem konsistenten Format, wie zum Beispiel:
[Start Byte] [Typ0] [Länge0] [Daten0] [Typ1] [ length1] [data1] ... [typeN] [lengthN] [dataN] [end byte]
Das obige Format ist ein allgemeinerer/flexiblerer Ansatz und einige erweiterte Protokolle erlauben die Beschreibung großer Datenstrukturen mit a ähnliches Format Aber in unserem einfachen Fall mit nur einer möglichen Nachricht können wir annehmen, dass das sendende Gerät und das empfangende Gerät die Reihenfolge jedes "Objekts" in der Nachricht vereinbaren und dass sie auch die Art und die Länge jedes "Objekts" in Bytes kennen Sie müssen diese Daten nicht übertragen. Wenn Sie eine von mehreren möglichen Strukturen übertragen möchten, können Sie ein einzelnes [Typ] Byte verwenden, um zu kommunizieren, welche Struktur gesendet wird. Du hast wirklich viele Optionen, also viel Spaß damit. Sie erhalten Bonuspunkte für die Verwendung eines CRC, um sicherzustellen, dass Ihre Daten unverfälscht übertragen werden.
Ich entschuldige mich für den Mangel an ausgefallenen Formatierung; Ich bin ein Neuling, um SO Fragen wirklich zu beantworten.
Enthält die Struktur Zeiger? –
Andere mögliche Hindernisse: Die Struktur ist möglicherweise nicht die gleiche Größe auf jeder Maschine; und Endianness. –
@IanAbbott Die Strukturen selbst nicht, sollten sie? – SensationSama