Forum: Mikrocontroller und Digitale Elektronik Problem mit Big & Little endian Daten im Strukt sind verkehrt


von C. H. (hedie)


Lesenswert?

Hallo zusammen

Ich habe folgenden Code:
1
struct ID_02  {
2
  unsigned int    Length;
3
  unsigned char  Msg_ID;
4
  unsigned char  X_Pos[4];
5
  unsigned char   Y_Pos[4];
6
  unsigned char   Z_Pos[4];
7
  unsigned char   X_Speed[4];
8
  unsigned char   Y_Speed[4];
9
  unsigned char   Z_Speed[4];
10
  unsigned char   Mode_1;
11
  unsigned char   HDOP;
12
  unsigned char  Mode_2;
13
  unsigned char  GPS_Week[2];
14
  unsigned char  GPS_Tow[4];
15
  unsigned char  SV_In_Fix;
16
  unsigned char  CH1_PRN;
17
  unsigned char  CH2_PRN;
18
  unsigned char  CH3_PRN;
19
  unsigned char  CH4_PRN;
20
  unsigned char  CH5_PRN;
21
  unsigned char  CH6_PRN;
22
  unsigned char  CH7_PRN;
23
  unsigned char  CH8_PRN;
24
  unsigned char  CH9_PRN;
25
  unsigned char  CH10_PRN;
26
  unsigned char  CH11_PRN;
27
  unsigned char  CH12_PRN;
28
  unsigned char  Checksum[2];
29
};
30
31
32
int main(void)
33
{
34
35
....
36
37
struct ID_02 *GPS_Data;
38
GPS_Data = (struct ID_02 *)&RX_Buffer[0];
39
itoa(GPS_Data->Length, Buffer, 10 );
40
lcd_string(Buffer);
41
42
....
43
44
45
}

Die Daten im Strukt sehen wie Folgt aus:

00 29 02 00 00....

So nun das problem...
Mit GPS_Data length greife ich ja auf die ersten beiden Bytes zu.
0x00 0x29

Doch leider wird nicht der wert 0x0029 sondern der Wert 0x2900 auf dem 
Display angezeigt...

Wie kann ich das umdrehen?

Danke schonmal...



[/c]

von Udo S. (urschmitt)


Lesenswert?

indem du nicht int definierst, sondern:

unsigned char hilen
unsigned char lolen

und nach dem einlesen:
int len = hilen << 8 + lolen;

von C. H. (hedie)


Lesenswert?

ich denke das hat mit Little und big endian zu tun...

Wenn ich es auf LittleEndian umstelle wird das auswirkungen auf die UART 
Verbindung haben? Wenn nein, wie stelle ich auf littleendian um?

von (prx) A. K. (prx)


Lesenswert?

Claudio Hediger schrieb:

> Wenn nein, wie stelle ich auf littleendian um?

Bei den meisten Controllern: Chipdesign aufkaufen, modifizieren, eigenen 
Chip herstellen. Nur manche kann man tatsächlich umstellen.

M.a.W: per Software. Im Netzwerkbereich hat man dazu Funktionen/Makros 
wie ntohs() und dergleichen. Passt der Prozessor zur Definition, dann 
sind das Leerfunktionen, passt er nicht, dann wird gedreht. Meistens 
wird gedreht, weil im Netz big endian üblich ist und die meisten 
Prozessoren little endian arbeiten.

von C. H. (hedie)


Lesenswert?

Ok vielen dank...

also muss ich mir ein paar Umkehr funktionen schreiben...

von Karl H. (kbuchegg)


Lesenswert?

Oder so, wie Udo das gezeigt hat.
Damit ist das Problem dann Schnee von gestern. Du ordnest einfach die 
Einzelbytes in der Reihenfolge, wie sie dir übertragen werden und setzt 
dann den eigentlichen Wert selber zusammen. Das geht dann auf jeden 
Fall, weil du den "Dreher" schon in der Datenstruktur hast.

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.