Forum: PC-Programmierung Beliebige Daten über RS232 versenden


von BYTEli (Gast)


Lesenswert?

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!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von BYTEli (Gast)


Lesenswert?

Das sieht doch schon mal einigermassen elegant aus. Vielen Dank!

von Christian R. (supachris)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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
Noch kein Account? Hier anmelden.