www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CRC 16 gibt nicht den geleichen Resultat auf den PC wie auf dem uC


Autor: Kabi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Kann mich jemandem helfen, ich habe ein problem mit CRC-16 Berechnung.

Ich verwende den gleichen C Code auf meinem uC (Renesas H8) sowie auf 
dem PC um die CRC zu berechnen, das Problem ist, dass ich nicht den 
geleichen Resulat erhalte!

Hier mein Code:
//! CRC value updated by crc_update_crc16_f()
static uint16_t mod_crc_value = 0x1D0F;

/************************************************************************************/
void crc_reset_crc16_f(void)
{
  mod_crc_value = 0x1D0F;
}

/************************************************************************************/
uint16_t crc_update_crc16_f(uint8_t const data_to_add)
{ 
  mod_crc_value  = (mod_crc_value >> 8) | (mod_crc_value << 8);
  mod_crc_value ^= data_to_add;
  mod_crc_value ^= (mod_crc_value & 0xff) >> 4;
  mod_crc_value ^= mod_crc_value << 12;
  mod_crc_value ^= (mod_crc_value & 0xff) << 5;

  return (mod_crc_value);
}

/************************************************************************************/
uint16_t crc_get_crc16_f(uint8_t const data[], uint16_t nb_bytes)
{
  uint16_t bytes_counter;

  crc_reset_crc16_f();
  for(bytes_counter = 0; bytes_counter < nb_bytes; bytes_counter++)
  {
    crc_update_crc16_f(data[bytes_counter]);
  }

  return (mod_crc_value);
}

Ich nehme and, dass es mit big/little endian zu tun hat, aber ich finde 
die Lösung nicht.

Danke für eure Hilfe!

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich nehme and, dass es mit big/little endian zu tun hat

Das liegt natuerlich sehr nahe.....

> aber ich finde die Lösung nicht.

Wir koennten jetzt ja alle mal raten, aber warum laeufst du nicht mal 
parallel mit dem Debugger durch beide Codes und schaust nach an welcher 
Stelle du das erstemal einen anderen Wert zurueckbekommst?

Olaf

Autor: Kabi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Vorschlag!

Aber nach meiner Recherchen auf dem Internet habe in Wikipedia gesehen, 
dass die Implementation für little endian ganz anderst ist. Ich habe 
auch mit eine andere Implementierung probiert, leider ohne erfolg. Ich 
habe keine Lust/Zeit die Herstellung eine CRC16 bis ins letzt Detail zu 
anlaysieren, darucm dachte ich hätte vielleicht jemandem das Problem 
schon gehabt.

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  Ich habe keine Lust/Zeit die Herstellung eine CRC16 bis ins letzt
>  Detail zu anlaysieren,

Du meinst du kannst mit deinem Problem leben und laesst alles so wie es 
ist? Im uebrigen ist es doch wohl kein Problem mal eben mit den Debugger 
durch den Code zu steppen. Oder wenn du keinen haben solltest, dir 
einfach mal den Wert der Variablen bei einem Durchlauf ausgeben zu 
lassen.
Es mag ja sein das du gerne faul bist, aber wir koennnen gut damit leben 
wenn dein CRC macht was er will. :-)

> darucm dachte ich hätte vielleicht jemandem das Problem
> schon gehabt.

Wenn du ernsthaft auf Hilfe anderer Leute hoffst dann solltest du denen 
auch alle Informationen liefern. Wenn du also ausschliessen kannst das 
es nicht an Intel/Motorola Formaten liegt dann solltest du doch 
mindestens die Definition deiner Datentypen angeben oder?

Olaf

Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kabi schrieb:
> ...
> Ich habe keine Lust/Zeit die Herstellung eine CRC16 bis ins letzt Detail
> zu anlaysieren,...

Dann solltest du es ganz lassen. Programmieren / E-Technik verlangt, 
dass man sich auch mit Details beschäftigt. Sonst kommt nix gescheites 
dabei raus.

Autor: Kabi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem lag nicht an der CRC-Implementierung, somit habe ich richtig 
entscheiden das ganze nicht auseinander zu nehmen!

Wie oft der Falls ist, war eine falsche Pointerreferenz die Uhrsache, 
somit funktionniert mein Sourcecode auf Systeme mit big und little 
endiant.

@ x-rocka

Ich habe mich mit die Details beschäftigt aber von CRC habe ich 
weiterhin keine Ahnung, aber es funktionniert ;-)

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.