Brom B. schrieb:
> Aber muss ich dann von vorne oder von hinten Starten also 00000101 oder
> 10100000 und ist das bei den Values das gleiche oder umgekehrt?
Wenn du die UART-Funktionen nutzt, passt das.
Bei der eigentlichen Payload (die 4 Bytes vor der CRC) wird das
niederwertigste Byte zuerst gesendet, aber das musst du bei der
CRC-Berechnung nicht berücksichtigen.
Das entspricht auch genau der Speicherreihenfolge eines int beim STM32.
Die CRC-Berechnung wird immer von Links nach Rechts über die ersten 7
Bytes durchgeführt.
Die Reihenfolge ist dabei natürlich nicht egal.
Für die CRC-Berechnung ist der Beispielcode ja dabei:
1 | // C-CODE EXAMPLE FOR CRC CALCULATION
|
2 | void swuart_calcCRC(UCHAR* datagram, UCHAR datagramLength)
|
3 | {
|
4 | int i,j;
|
5 | UCHAR* crc = datagram + (datagramLength-1); // CRC located in last byte of message
|
6 | UCHAR currentByte;
|
7 | *crc = 0;
|
8 | for (i=0; i<(datagramLength-1); i++) { // Execute for all bytes of a message
|
9 | currentByte = datagram[i]; // Retrieve a byte to be sent from Array
|
10 | for (j=0; j<8; j++) {
|
11 | if ((*crc >> 7) ^ (currentByte&0x01)) // update CRC based result of XOR operation
|
12 | {
|
13 | *crc = (*crc << 1) ^ 0x07;
|
14 | }
|
15 | else
|
16 | {
|
17 | *crc = (*crc << 1);
|
18 | }
|
19 | currentByte = currentByte >> 1;
|
20 | } // for CRC bit
|
21 | } // for message byte
|
22 | }
|
datagram ist dabei ein Pointer auf deine empfangenen Bytes und
datagramLength ist natürlich 8. (gesamtes Paket inkl. CRC)