mikrocontroller.net

Forum: Compiler & IDEs NMEA Checksum


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Manni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char cs = 0xf5;
unsigned char buffer[3];

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

etwa so?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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];

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
digits[16] = 0x0D

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dass, heißt, ichkann dann zB. schreiben:

  String[6] = digits[0x0D];

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, Walter hat nicht richtig gelesen..


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

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

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, wenn dann

String[6] = 0x0D;

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

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tschuldigung, das 'D'.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.