NMEA Parser

Hallo!
Ich würde gern wissen, wie ein NMEA Parser programmiert wird.
Hier hab ich ein Beispiel gefunden: Arduino GPS clock using NMEA protocol | electronicsblog.net
Da wird ein Befehl verwendet, den ich nicht verstehe:

buffer[0]&0x0F

Was bedeutet der bzw. die ganzen ?
Ist buffer ein eindimensionales Array?
Was bedeutet das &0x0F danach?

Habt Ihr evtl. ein paar brauchbare Links..?

Vielen Dank!
Mirko

& ist diesem Fall eine bit-weise Und-Verknüpfung. Damit wird das niederwertige Halb-Byte maskiert, d.h. alle anderen Bits außer 1111 werden auf Null gesetzt

EDIT:
Da wird ASCII in Zahlen gewandelt. Das kann man verständlicher machen indem man Minus 48 oder Minus 0x30 macht. Einfach weil '0' den ASCII Wert 48 hat

48 = '0' = 11 0000
49 = '1' = 11 0001

Wenn man dann einfach alles außer den unteren 4 Bit auf 0 setzt, wird aus 48 -> 0 oder aus 49 -> 1

Das war verständlich.
Dankeschön! :slight_smile:

Und was bedeutet das "int" in Klammern?
Macht man so die Konversion von String in Integer?
Oder anders herum: Würden die bei der von Dir beschriebenen Bit-Operation entstehenden Ergebnisse sonst weiter als String bestehen bleiben und einen type mismatch error erzeugen?

Das in Klammern nennt sich Cast oder Typ-Umwandlung:

Damit wird ein char (kein String!) in int umgewandelt damit man damit rechnen kann und 2 Bytes statt 1 Byte hat. Im Prinzip:
char c = '1';
int zahl = (int)c;

Ein Typ-Mismatch entsteht da nicht. Der Compiler ist in diesem Fall in der Lage das implizit zu konvertieren. Der Cast ist unnötig so wie ich das sehe. Das hier kompiliert in C++ auf dem PC problemlos und gibt das richtige Ergebnis aus:

   char ch = '1';
   short zahl = ch & 0x0F;
	
   cout << (bitset<8>)ch << endl << (bitset<16>)zahl << endl;

Short statt int, da int auf dem PC 4 Bytes hat. Das mit dem bitset ist um die Binärdarstellung zu erhalten.

Sehr richtig, Serenifly!

Das kann man verständlicher machen indem man Minus 48 oder Minus 0x30 macht. Einfach weil '0' den ASCII Wert 48 hat

Noch verständlicher wird es, wenn man sich nur merkt, dass die Zahlen aufeinanderfolgen :
Also muss man von dem Ascii-Zeichen nur das Zeichen '0' subtrahieren.

'9' - '0' = 9

byte b = buffer[i] - '0';  // liefert eine Zahl 0 .. 9, wenn in buffer[i] eins der Zeichen '0' .. '9' steht.

Dass '0' die Zahl 0x30 ist, merkt man sich mit der Zeit auch leicht :wink:
Aber -'0' ist genausoschnell gerechnet wie &0x0F, wenn mich nicht alles täuscht. Bräuchte man also gar nicht zu wissen...

@Mirko:
ja , buffer ist ein Array, buffer[0] ist das erste Element.

String ist übrigens ein missverständliches Wort : in der Referenz findest du

string - char array
String - object

buffer ist vermutlich ein char array...

Vielen Dank für Eure Erklärungen! :slight_smile:

Ich werde jetzt mal ein bisschen herumtesten um zu sehen, ob ich das vollständig verstanden habe.
Dann melde ich mich bestimmt nochmal...