www.mikrocontroller.net

Forum: PC-Programmierung Beliebige Daten über RS232 versenden


Autor: BYTEli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
union hilfsunion 
{
  meindatentyp Nutzdaten;
  char Alternative[sizeof (meindatentyp)];
};

hilfsunion x;

x.Nutzdaten = 1234.567;

for (i = 0; i < sizeof (meindatentyp); i++)
  sende_daten(hilfsunion.Alternative[i]);

... wenn meindatentyp beispielsweise float ist.

Autor: BYTEli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sieht doch schon mal einigermassen elegant aus. Vielen Dank!

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ein Protokollrahmen gehört ja wohl zu jeder Datenübertragung.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.