JoHaEleben
Level-1
- Beiträge
- 1
- Reaktionspunkte
- 0
-> 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:
Das Ergbnis ist 0x342F und entspricht der Angabe des Herstellers.
Mein ST-Code bis hierher:
Übergeben wird:
Vielleicht kann mir jemand bei der Übersetzung helfen ...
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

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: