PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Problem Char to long, littel Endian



damfino
01.01.2016, 20:11
Ich will vom GPS Empfänger das UBX Protokoll auslesen, geht soweit das der Start von der Nachricht und Nachricht ID erkannt wird.
Die Werte bekomme ich aber nicht heraus. Der Wert auf den ich aus bin besteht aus 4 Bytes im little Endian Format.

Mein Problem: ich bekomme derzeit nichtmal ein einziges Byte umgewandelt.

Probiert habe ich:

x[0]=gps_string[3+offset];x[1]= 0;
temp=atoi(x);
Temp ist aber immer Null (Ausgabe LCD mit itoa(temp,buffer,10);lcd_puts(buffer); )

Ebenso probiert (die ersten 2 Byte würde mir genügen):


x[0]=gps_string[3+offset];
x[1]=gps_string[2+offset];
x[2]=0;

pos_acc=atoi(x);

und



x[0]=gps_string[3+offset];
x[1]=gps_string[2+offset];
x[2]=0;

pos_acc=strtol(x, NULL, 10);

Es kommt immer nur Null raus.
Werte sollten zwischen 100-5000 liegen. Dazu lasse ich mir den 2D Accuracy Wert übers NEMA Protokoll ausgeben der ungefähr die gleiche Größenodung hat wie der 3D Wert den ich hier über ubx Protokoll auslesen will.


Die ganze GPS Auswertung funktioniert bei mit mit atoi, warum hier nicht?

Wie muss man das richtig umwandeln?

Werte kommen vom GPS Empfänger raus, erstens werden die ersten 4 Bytes der Nachricht überprüft (2 Sync Char, 1 Byte Class, 1 Byte ID) um die richtige Nachricht zu erkennen, was ich mir anzeige lassen, und am uBlox Center kann man sich auch die Daten ansehen.

LG!

Klebwax
02.01.2016, 08:54
Ich würd das so machen:


int32_t wert;
wert = gps[offset + 0];
wert |= gps[offset + 1] << 8;
wert |= gps[offset + 2] << 16;
wert |= gps[offset + 3] << 24;


MfG Klebwax

damfino
02.01.2016, 09:25
Danke, das schein zu funktionieren!

Warum muss man hier nicht atoi() verwenden??? Dachte ich muss die Werte vom UART zuerst in Zahlen umwandeln und dann wieder neu in richtiger Reihenfolge zusammenbauen.

Klebwax
02.01.2016, 10:07
Warum muss man hier nicht atoi() verwenden??? Dachte ich muss die Werte vom UART zuerst in Zahlen umwandeln und dann wieder neu in richtiger Reihenfolge zusammenbauen.

UART ist hier unerheblich, das beschreibt nur den Datentransport nicht die Kodierung. atoi() heißt lang "ascii to integer", deine Daten sind aber nicht ASCII kodiert sondern binär, genauer 4 * 8 Bit binär, low Byte first. Und die werden in der richtigen Reihenfolge zusammengesetzt, an der richtigen Stelle in das 32 Bit int "hinein geodert".

MfG Klebwax

damfino
02.01.2016, 10:34
Jetzt habe ich es kapiert, stehe mit den Arten der Datenkodierung immer etwas auf Kriegsfuß bis ich es verstehe :)

LG Werner