CRC Berechnung (C-Code zu ST)

JoHaEleben

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich möchte die CRC Berchnung durchführen. Leider kann ich die Art des CRC16 nicht identifizieren - die Online Rechner liefern andere Ergebnisse.
Ich habe aber funktionierenden C-Code. Leider bekomme ich diesen nicht in ST übersetzt. Die Operatoren verhalten sich scheinbar anders als erwartet ;). Vielleicht kann jemand helfen.

Mein funktionierender C-Code:

Code:
static void LCPUpdateCRC(unsigned short *crc, unsigned char byte)
{
    char i; // loop variable
    char XORFlag; // flag indicating the polynomial should be XORed
    // Combine the new data byte with the current CRC.
    if (crc != NULL) { // ensure the CRC is wanted
        for (i = 7; i >= 0; --i) { // loop through each bit in the data byte
            XORFlag = (unsigned char)((*crc & 0x8000) != 0x0000);
            *crc <<= 1; // shift the CRC left
            *crc |= (unsigned short)((byte >> i) & 0x01);
            if (XORFlag) // check for CRC overflow
                *crc ^= 0x1021; // XOR with polynomial
        }
    }
}

void checkCRC()
{
    unsigned short crc = 0x7E7E;
    unsigned char msg[5];
    msg[0] = 0xFA;
    msg[1] = 0xFF;
    msg[2] = 0x02;
    msg[3] = 0x01;
    msg[4] = 0x00;
    for (unsigned char i = 0; i < 5; i++)
    {
        LCPUpdateCRC(&crc, msg[i]);
    }
    std::cout << "CRC:\t";
    std::cout << std::hex << crc;
    std::cout << "\n";
}

Das Ergbnis ist 0x342F und entspricht der Angabe des Herstellers.

Mein ST-Code bis hierher:

Code:
FUNCTION LCP_CRC_GEN : WORD
VAR_INPUT
    PT : POINTER TO ARRAY[0..200] OF BYTE;
    SIZE : INT;
END_VAR
VAR
    pn : WORD;
    pos : INT;
    dx: BYTE;
    bits: INT;
    flag: BOOL;
END_VAR

(* align polygon *)
pn := WORD#1021;
pos := 0;

(* init value *)
LCP_CRC_GEN := 16#7E7E;

(* calculate CRC for each byte *)
WHILE pos < size DO
    dx := PT^[pos];
    pos := pos + 1;
    (* crc calculation for one byte *)
    FOR bits := 7 TO -1 BY -1 DO
        flag := ((LCP_CRC_GEN AND 16#8000) <> 0);
        LCP_CRC_GEN := SHL(LCP_CRC_GEN, 1);
        LCP_CRC_GEN := LCP_CRC_GEN OR (WORD_TO_BYTE(SHR(dx,bits) AND  BYTE#01 ) );
        IF flag THEN
            LCP_CRC_GEN := LCP_CRC_GEN XOR pn;
        END_IF;
    END_FOR;
END_WHILE;

Übergeben wird:

Code:
VAR
    wCRC2:            WORD;
    baMsgCalc:        ARRAY[0..4] OF BYTE;
END_VAR

baMsgCalc[0] := 16#FA;
baMsgCalc[1] := 16#FF;
baMsgCalc[2] := 16#02;
baMsgCalc[3] := 16#01;
baMsgCalc[4] := 16#00;

wCRC2 := LCP_CRC_GEN(ADR(baMsgCalc), SIZEOF(baMsgCalc));


Vielleicht kann mir jemand bei der Übersetzung helfen ...
 
Zuletzt bearbeitet:
Zurück
Oben