mikrocontroller.net

Forum: PC-Programmierung Union vom µC senden und am PC empfangen


Autor: domi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe Daten in einer Union / Struktur auf einem Controller angelegt. 
Diese möchte ich byteweise über die serielle Schnittstelle senden und am 
PC wieder in die gleiche Union / Struktur einlesen und damit arbeiten.

Ich programmiere den AVR mit dem GCC und unter Windows in c++ mit Visual 
Studio .net.

Das senden und empfangen der Struktur ist kein Problem...

Ich habe mal mit sizeof überprüft, ob die Struktur unter Windows und auf 
dem Controller gleich groß ist. Auf dem Controller ist es korrekt 
(byte-genau), aber auf dem PC wird's scheinbar immer in 4Byte Blöcken 
gehandhabt. Wie kann ich sicher stellen, dass meine Strukturen auf dem 
Controller und auf dem PC exakt übereinstimmen, sodass ich wirklich Byte 
für Byte die Struktur übertragen kann?

Oder gibt's einfache alternativen?

Ich hoffe, ich habe das Problem klar geschildert.

domi

Autor: domi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja, damit das überhaupt funktioniert, müssen doch beide Systeme mit 
Big oder beide mit Little Endian arbeiten...

Womit arbeitet der AVR-GCC?

domi

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

Bewertung
0 lesenswert
nicht lesenswert
Das Phänomen unterschiedlich großer Strukturen liegt am sogenannten 
Alignment. Aus Performancegründen werden auf 32-Bit-Prozessoren 
Strukturelemente so ausgerichtet, daß auf sie mit einem 32-Bit-Zugriff 
zugegriffen werden kann. Liegt ein WORD oder DWORD aber auch nur um ein 
Byte daneben, muss der Prozessor nacheinander zwei Zugriffe durchführen 
und die Daten zusammensetzen. Das macht auf einem PC zwar die Hardware 
(also nicht das vom Compiler erzeugte Programm!), aber langsam ist's 
trotzdem.

Bei Microsoft-C-Compilern kann diese Strukturausrichtung mit
#pragma pack(1) abgeschaltet werden.

Damit der Rest (Strukturen des OS etc.) nicht davon beeinflusst werden, 
solltest Du so vorgehen:
#pragma pack(push)  // alte Einstellung merken
#pragma pack(1)     // Alignment auf Bytegrenzen
struct meinestruktur
{
  // etc.
};
#pragma pack(pop)   // alte Einstellungen wiederherstellen

Das sieht bei anderen Compilern anders aus, sollte aber in deren 
Dokumentation beschrieben werden.

Autor: domi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Rufus! Bin mal gespannt, ob das so mit der Übertragung 
funktioniert.

Domi

Autor: Pitt Bull (pittbull)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wegen den von rufus erwähnten gründen (alignment und padding) sollte man 
immer vermeiden, structs etc. zwischen verschieden gearteten systemen 
auszutauschen. das geht nur wirklich zuverlässig mit byte arrays. auch 
sollte man vorher festlegen, in welchem format multibyte werte 
übertragen werden (low-byte zuerst oder anders)...

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.