Hallo! Ich möchte Daten vom PC zum Mikrocontroller und umgekehrt versenden. Dazu hat der Controller UART. Das klappt auch wunderbar. Nun möchte ich aber nicht nur einzelne Bytes, sondern z.B. einen u32_t (also eine Zahl, die 4 Bytes Speicher braucht) versenden, oder noch allgemeiner: eine beliebige struct. Wie geht man da vor? Bei einem u32_t kann ich mir mit schiebe operationen und dann einem u8_t zuweisen noch helfen, aber bei double-Werten kommt da nichts gescheites raus. Wie kann ich also ganz allgemein einen Datentypen in Bytes zerlegen (und auf der Gegenstelle wieder zusammensetzen)? Eine beliebige struct muss es nicht zwingend sein, könnte mir aber vorstellen, dass auch das mal gebraucht wird. Ich bin nicht zu faul zum Suchen, aber wie so oft fehlen mir die benötigten Suchwörter... Ich schreibe deswegen ins "PC-Programmierung"-Forum, weil ich sowohl auf dem Controller wie auch auf dem PC in C programmiere und es deshalb wohl auf beiden Seiten analog (irgend wie passt das Wort analog nicht ;)) sein sollte. Danke für jeden Tipp!
Jedes im Speicher liegende Objekt kann unabhängig von seinem Typ als Folge von Bytes angesehen werden. Und genau so lässt sich jedes Objekt auch über eine byteorientierte Schnittstelle transportieren. Man muss allerdings beachten, daß je nach Architektur der verwendeten Maschine sich die Repräsentation im Speicher unterscheiden kann - "endianness" ist eines der Stichworte, bei Strukturen kommt da noch das Alignment hinzu. Ohne brachiale Typecasts lässt sich soetwas mit einer union aus einem char-Array und dem eigentlich zu nutzenden Datentyp erledigen:
1 | union hilfsunion |
2 | {
|
3 | meindatentyp Nutzdaten; |
4 | char Alternative[sizeof (meindatentyp)]; |
5 | };
|
6 | |
7 | hilfsunion x; |
8 | |
9 | x.Nutzdaten = 1234.567; |
10 | |
11 | for (i = 0; i < sizeof (meindatentyp); i++) |
12 | sende_daten(hilfsunion.Alternative[i]); |
... wenn meindatentyp beispielsweise float ist.
Das sieht doch schon mal einigermassen elegant aus. Vielen Dank!
Kannst auch komplette Strukturen verschicken. Einfach einen Pointer auf die Struktur, den nach unsigned char casten und die Länge in Bytes der kompletten Struktur mit sizeof() holen.
Da offensichtlich nich immer klar ist, was gesendet wird, würde ich als erstes Byte eine Info senden, was für nachfolgende Daten kommen Bsp. 1=Byte, 2=Word, 3=Typ x, 4=Typ y. So kannst Du auf der Gegenstelle immer kontrollieren, ob auch die richtige Anzahl von Bytes kommen. Ansonsten weißt Du nicht, ob schon genug Daten da sind, oder noch zu warten ist.
Naja, ein Protokollrahmen gehört ja wohl zu jeder Datenübertragung.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.