Forum: Compiler & IDEs NMEA Checksum


von Matthias (Gast)


Lesenswert?

Hallo.
Ich habe eine Checksumme berechnet, das Ergebnis muss aber aus 2
Characters bestehen. Dass heißt, ich will jedes Hexnibbel im Bereich
0...9 A...F aus meinem Ergebnis haben, damit ich es in einem Array in 2
Feldern speichern kann.

Im Prinzip:

char checksumme = 'F5';

char string[7]

string[5] = 'F'
string[6] = '5'

Wie bewerkstellige ich das am Besten?

Ich habe mir schon Gedanken gemacht, die Checksumme bitweise mit 0000
1111 bzw 1111 0000 zu verunden, um so jewils ein Nibbel auszublenden.
Das Ganze scheint mir jedoch sehr umständlich zu sein.

Hab noch eine Idee:

Geht das so:?

string[5] = (checksumme > 4);  //High nibble
string[6] = (checksumme < 4);  //Low nibble

Gruß Matthias

von Manni (Gast)


Lesenswert?

unsigned char cs = 0xf5;
unsigned char buffer[3];

buffer[0] = cs & 0xf0;
buffer[1] = cs & 0x0f;

etwa so?

von Matthias (Gast)


Lesenswert?

Genau so hatte ich das gedacht, habe ich aber dann nicht das Problem,
dass ich dann in Buffer[0] das erste Nibble plus die 0 vom 2. Nibble
stehen habe? Das will ich nämlich nicht. Im Buffer[0] soll nur das
erste Nibble stehen zB F.

von Rolf Magnus (Gast)


Lesenswert?

> char checksumme = 'F5';

Meintest du nicht eher:

  char checksumme = 0xF5;

Wobei dieser Wert in einen char vermutlich nicht reinpasst, da dieser
Typ bei gcc in der Regel vorzeichenbehaftet ist und damit nur bis 0x7f
geht.

> Geht das so:?
>
> string[5] = (checksumme > 4);  //High nibble
> string[6] = (checksumme < 4);  //Low nibble

Da die Variable "string" heißt, nehme ich an, daß du Zeichen haben
willst. Dann geht das so nicht (aber sonst wäre es auch nicht
gegangen). Mal angenommen, du meintest nicht > und <, sondern >> und
<<: In string[5] steht nachher bei obigigem checksumme eine 16 (0xF)
drin und nicht das Zeichen 'F'. In string[6] steht 80 drin (0x50).

Etwa so könntest du es machen:

char digits[16] = "0123456789ABCDEF";
string[5] = digits[(unsigned char)checksumme >> 4];
string[6] = ditigs[checksumme & 0x0F];

von Matthias (Gast)


Lesenswert?

Klasse, so funktionierts.

Als Stringendzeichen will ich ein Carriage Return setzten,
(im ASCII Code 0x0D oder Dezimal 13). Wie bekomme ich das in ein Array
Feld hinein?

Und vielen Dank nochmal

von Walter (Gast)


Lesenswert?

digits[16] = 0x0D

von Matthias (Gast)


Lesenswert?

Dass, heißt, ichkann dann zB. schreiben:

  String[6] = digits[0x0D];

von Simon K. (simon) Benutzerseite


Lesenswert?

Nein, Walter hat nicht richtig gelesen..


Richtig wäre
1
char digits[16] = "0123456789ABCDEF";
2
string[5] = digits[(unsigned char)checksumme >> 4];
3
string[6] = ditigs[checksumme & 0x0F];
4
string[7] = 0x0D

Sodass 0x0D (ASCII 13) am Ende des Arrays "string" steht.

von Walter (Gast)


Lesenswert?

Nein, wenn dann

String[6] = 0x0D;

digit mit dem Index 13 gibt an String[6] das 'E' zurück.

von Walter (Gast)


Lesenswert?

Tschuldigung, das 'D'.

von Matthias (Gast)


Lesenswert?

Danke. Das leuchtet mir auch ein!
Jetzt funktioniert es auch richtig.

Aber Vorsicht 2. Mal (in 3. Zeile) ist digits falsch geschrieben!

Vielen Dank euch
Matze

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.