mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Checksumme berechnen – "richtiger Weg"


Autor: der tinkerer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich habe folgenden funktionierenden Code zusammengehackt, um eine 
Checksumme für ebenfalls folgend beschriebenes Protokoll zu überprüfen. 
Es geht dabei um einen RFID-Reader, welcher die gelesenen Tag-IDs auf 
eine serielle Schnittstelle ausgibt. Wie beschrieben kommt die Nachricht 
in einzelnen Bytes rein, ich suche nach Start- und Stoppbyte und 
sortiere alle empfangenen Bytes dann in einen Buffer (auf welchen 
matches_checksum() wiederum zugreift).

Nun zur Frage: Mein Ansatz erscheint mir ziemlich "roh". Gibt es einen 
eleganteren Weg die Checksumme zu berechnen? Ist es tatsächlich nötig 
alle Bytes wieder nach Hex zu konvertieren oder gibt es auch eine 
Berechnung ohne Konvertierung?

Wie geschrieben funktioniert der Code, mir geht es eher um Best 
Practices, den "richtigen Weg" und ganz generell darum meine Kenntnisse 
zu verbessern.

Bei interesse poste ich auch den gesamten Code, der die ID vom 
RFID-Reader empfängt, in ein neues Format bringt und auf der Seriellen 
wieder ausspuckt. Läuft auf einem Arduino.

Dank & Gruß,
der tinkerer

/* 
  Protocol of RFR101A1M (seeedstudio.com RFID 125khz module)
  | Start  | ID                                              | CHECKSUM | STOP   |
  | 1 Byte | 10 Bytes                                        | 2 Bytes  | 1 Byte |
  | 2      | 50 | 67 | 48 | 48 | 52 | 54 | 56 | 69 | 51 | 70 | 68 | 66  | 3      |
  
  Example ID is 2C00468E3F, every digit in ID and CHECKSUM will be transmitted as 
  single bytes.
  
  Original ID:         | 0x2C    | 0x00    | 0x46    | 0x8E    | 0x3F    |
  to digits:           | 2  | C  | 0  | 0  | 4  | 6  | 8  | E  | 3  | F  | 
  Transmitted as byte: | 50 | 67 | 48 | 48 | 52 | 54 | 56 | 69 | 51 | 70 |
  
  Checksum is XOR of HEX values of ID (2 Bytes form 1 HEX).
  0x2C (XOR) 0x00 (XOR) 0x46 (XOR) 0x8E (XOR) 0x3F = 0xDB (sent as 68, 66)
  
  Complete message as put on serial port (inserted spaces for easier reading):
  2 50 67 48 48 52 54 56 69 51 70 68 66 3 
*/

uint8_t ASCII2int(char data){
  data -= '0';
  if (data > 9) 
    data -= 7;
  return data;
}


boolean matches_checksum( void )
{
  byte hex_1;
  byte hex_2;
  byte hex_3;
  byte hex_4;
  byte hex_5;
  byte hex_calc;
  byte hex_check;
  

  // msg.msg.id[n] and msg.msg.check[n] point to matching byte in buffer
  hex_1 = ASCII2int(msg.msg.id[0])*16 + ASCII2int(msg.msg.id[1]);
  hex_2 = ASCII2int(msg.msg.id[2])*16 + ASCII2int(msg.msg.id[3]);
  hex_3 = ASCII2int(msg.msg.id[4])*16 + ASCII2int(msg.msg.id[5]);
  hex_4 = ASCII2int(msg.msg.id[6])*16 + ASCII2int(msg.msg.id[7]);
  hex_5 = ASCII2int(msg.msg.id[8])*16 + ASCII2int(msg.msg.id[9]);
  hex_check = ASCII2int(msg.msg.check[0])*16 + ASCII2int(msg.msg.check[1]);
  
  hex_calc = hex_1 ^ hex_2 ^ hex_3 ^ hex_4 ^ hex_5;
  if ( hex_calc == hex_check )
  {
    return true;
  } else {
    return false;
  }
}

Autor: Willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo und guten Abend.

Ich habe gerade mit Google Ihren Beitrag gefunden, es ist zwar lange 
her, dass Sie es geschrieben haben, aber ich hoffe, dass Sie mir 
vielleicht helfen könnten.
Wenn ich einen Feedback auf diese Nachricht bekommen würde, würde ich 
ihnen mein Problem gerne schildern.
Es geht um Rfid Tag´s, bzw. um denen Checksumme, die offensichtlich aus 
der ID der Tag´s berechnet wird.

Vielen Dank im Voraus

Mfg Willi

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.