CRC-8 Berechnung

Beiträge
5.710
Reaktionspunkte
1.182
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
das Folgende läuft unter dem Motto "Denn er weiß nicht was er tut".
Ich erstelle, unter anderem, ein Programm zur Berechnung einer CRC. Als Vorlage habe ich ein C++ Programm bekommen das ich in CODESYS wie folgt umgesetzt habe:

Code:
CRC := 0;

FOR Counter1 := 4 TO XMod_BuffSize - 2 DO
    CRC := SHL(CRC XOR XModemBuffer[Counter1], 8);
    FOR Counter2 := 1 TO 8 DO
        IF CRC.15 THEN
            CRC := SHL(CRC, 1) XOR 16#1021;
        ELSE
            CRC := SHL(CRC, 1);
        END_IF
    END_FOR
END_FOR

CRC ist ein INT und XModemBuffer, wie geschrieben, ein Byte-Array.
Was ich nicht wusste ist, dass es verschiedene CRCs gibt und der Code der Vorlage wohl für Words gedacht war, dass Array das ich jetzt bearbeite jedoch ein Byte-Array ist.
Hat einer eine Idee wo ich was ändern muss? Ich habe natürlich schon nach der CRC-Berechnung gegoogelt und wurde mit Ergebnissen erschlagen, aber durchgestiegen bin ich leider nicht.
 
Hallo,

Hallo,
CRC ist ein INT und XModemBuffer, wie geschrieben, ein Byte-Array.
Was ich nicht wusste ist, dass es verschiedene CRCs gibt und der Code der Vorlage wohl für Words gedacht war, dass Array das ich jetzt bearbeite jedoch ein Byte-Array ist.
Hat einer eine Idee wo ich was ändern muss? Ich habe natürlich schon nach der CRC-Berechnung gegoogelt und wurde mit Ergebnissen erschlagen, aber durchgestiegen bin ich leider nicht.

wenn ich das mit dem

Code:
uint16_t
crc_xmodem_update (uint16_t crc, uint8_t data)
{
int i;
crc = crc ^ ((uint16_t)data << 8);
for (i=0; i<8; i++)
{
if (crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
return crc;
}
sieht da ja schon recht ähnlich aus. Anhand der Datentypen siehst Du das es bereits für Bytes ist.
Nur ist da eine Zeile Bei Dir falsch.

Code:
CRC := SHL(CRC XOR XModemBuffer[Counter1], 8);

die müßte so lauten
Code:
CRC := CRC XOR SHL(BYTE_TO_WORD(XModemBuffer[Counter1]), 8);
erst schieben, dann XOR

Gruß
 
Zurück
Oben