Dann lasse ich die CRC16 mit den Polynom 0xA001 rüberlaufen:
1
crc_fInit();
2
for(i=0;i<9;i++)
3
{
4
crc_fUpdate(message[i]);
5
}
Als Ergebnis erhalte ich hier "54110".
Nun kopiere ich dieses Ergebnis in die letzten beiden "Zeichen"
1
message[7]=(U16crc>>8);
2
message[8]=(U16crc&0xFF);
und lasse den Algorithmus erneut über die Nachricht laufen (was ja nun
die Empfängerseite wäre):
1
crc_fInit();
2
for(i=0;i<9;i++)
3
{
4
crc_fUpdate(message[i]);
5
}
Allerdings bekomme ich hier nicht die erwartete "0", sondern eine "7042"
als Ausgabe.
Sehr Ihr vielleicht, wo hier der Fehler stecken könnte?
Vielen Dank im Voraus für Eure Hilfe!!!
Oz zy schrieb:> Nun kopiere ich dieses Ergebnis in die letzten beiden "Zeichen"
Das ist nicht ganz richtig. Berechne CRC über die Nutzdaten (7 Zeichen
in deinem Fall) und hänge dann die CRC dran. Achte auf die richtige
Reihenfolge.
Es gibt n+1 erprobte und fehlerfreie Implementationen im Netz. Bei
GCC-AVR ist auch eine Lib dabei. Warum das Rad neu erfinden?
Hi,
erst einmal danke für Deine Antwort! Ich hatte es immer so verstanden,
dass für die CRC zuerst so viele Nullen (in Bits) an die Nachricht, wie
das Polynom groß ist. Über diese neu entstandene Nachricht wird dann die
CRC-Summe gebildet. Anschließend wird an den Rahmen (dann allerdings
ohne die Nullen) die Summe angehängt.
Ich erfinde ja auch das Rad nicht neu. Der Code, den ich oben
geschrieben habe ist der aus der avr-lib. Ich habe nur die crc global
gemacht, so dass sie nicht mitübergeben werden muss...
Viele Grüße
Ozzy
Oz zy schrieb:> Ich hatte es immer so verstanden,> dass für die CRC zuerst so viele Nullen (in Bits) an die Nachricht, wie> das Polynom groß ist.
Eine CRC wird über einen Bitstrom gebildet. Die Länge dieses Bitstroms
und die Größe des CRC sind komplett unabhängig voneinander. Du könntest
auch eine 64-Bit-CRC über 5 Bits erstellen (ohne irgendetwas auffüllen
zu müssen). Dass die CRC-Funktionen die Bits in "Paketen" (8, 16, 32,
... Bits) entgegennehmen, dient nur der Bequemlichkeit.
Hm,
ich kenne es eben auch aus Büchern so, wie es bei Wikipedia beschrieben
ist (ich weiß, das ist nicht die Quelle aller Quellen). Und da wird eben
doch etwas angehängt...
Oz zy schrieb:> ich kenne es eben auch aus Büchern so, wie es bei Wikipedia beschrieben> ist (ich weiß, das ist nicht die Quelle aller Quellen). Und da wird eben> doch etwas angehängt.
Wo (Link)?
Da wird doch nur für die theoretische Betrachtung (bzw. das
händische Dividieren) was angehängt. Bei einer realen
CRC-Implementierung ist dieses "Anhängsel" der CRC-Startwert, und nichts
was du deinen Nutzdaten hinzufügen müsstest.
Ok, danke, dann bin ich damit schon mal schlauer. Stimmt es aber
trotzdem, dass, wenn ich die CRC an die Nachricht anhänge und den
Algorithmus erneut durchlaufen lasse, eine "0" rauskommen sollte?
Oz zy schrieb:> Stimmt es aber> trotzdem, dass, wenn ich die CRC an die Nachricht anhänge und den> Algorithmus erneut durchlaufen lasse, eine "0" rauskommen sollte?
Ja.
Oz zy schrieb:> Ok, danke, dann bin ich damit schon mal schlauer. Stimmt es aber> trotzdem, dass, wenn ich die CRC an die Nachricht anhänge und den> Algorithmus erneut durchlaufen lasse, eine "0" rauskommen sollte?
ja, so mache ich es auch. Aber wenn ich mich recht daran erinnere denn
errechne ich die CRC ohne die beiden 0 bytes. Könnte ich heute abend mal
nachschauen.
Oz zy schrieb:> Also bei der ersten CRC-Berechnung:> ...> Als Ergebnis kommt da "15420" raus. Also weit weg von einer 0...
Wieso sollte da denn jetzt auch 0 raus kommen?
Oz zy schrieb:> Als Ergebnis kommt da "15420" raus. Also weit weg von einer 0...
ist ja wohl klar, wenn du jetzt aber die "15420" in der richtige
Reihenfolge anghägst und dann über die 9 zeihcen die CRC brechnest dann
sollte eine 0 rauskommen.
Peter II schrieb:> Aber wenn ich mich recht daran erinnere denn> errechne ich die CRC ohne die beiden 0 bytes.
Diese "beiden 0 bytes" sind in Wirklichkeit der Startwert.
Sorry, da habe ich mich unglücklich ausgedrückt. Ich berechne die CRC
über die Nachricht (ohne Anhang). Ergebnis: "31531". Diese 2 Byte hänge
ich an die Nachricht dran, und lasse die CRC-Berechnung nun über die
Nachricht + CRC laufen. Ergebnis: "15420" != "0"...