Hi,
ich möchte meine zu sendenden Daten über eine CRC16 absichern. Die
crc16.h bietet mir für meinen Atmega ja schon mal einen guten
Anhaltspunkt:
1 | uint16_t U16crc;
|
2 |
|
3 | void crc_fInit( void )
|
4 | {
|
5 | U16crc = 0xffff;
|
6 | }
|
7 |
|
8 | void crc_fUpdate(uint8_t value)
|
9 | {
|
10 | uint8_t i;
|
11 |
|
12 | U16crc ^= value;
|
13 | for (i = 0; i < 8; ++i)
|
14 | {
|
15 | if (U16crc & 1)
|
16 | {
|
17 | U16crc = (U16crc >> 1) ^ 0xA001;
|
18 | }
|
19 | else
|
20 | {
|
21 | U16crc = (U16crc >> 1);
|
22 | }
|
23 | }
|
24 | }
|
Allerdings will das ganze bei mir nicht klappen.
Also, angenommen ich habe diese Nachricht:
1 | unsigned char message[9] = {'M','e','s','s','a','g','e',0,0};
|
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!!!