To może na początek coś na rozruszanie mózgu
Postanowiłem, że napiszę sobie najprostszą funkcję do obliczania CRC dla mojego przypadku.
Założenia były następujące:- Wielomian postaci:
X^8+X^5+X^4+X^0 co daje binarnie: 0b
100110001 - długość 9 bitów!!!! - to jest bardzo ważne, 9

- Obrabiane
dane mieszczą się w typie
uint16_t - jeśli więcej to trzeba zmodyfikować kod.
A działanie przedstawia się następująco:
- do zmiennej
roboczej wsuwamy najstarszy bit zmiennej
dane- za pomocą odpowiedniej maski (0b00000001 00000000) sprawdzamy czy przypadkiem już w zmiennej
roboczej na pozycji
9 nie pojawila się jedynka
- jeśli nie to wsuwamy następny bit i ponownie sprawdzamy warunek
- pojawiła się w końcu jedynka... więc zmienną
roboczą XORujemy wartością naszego wielomianu

(0b100110001)
- ... i znowu wsuwamy bit, i znowu sprawdzamy czy na pozycji 9...
jak długo? odpowiedź: tyle ile jest bitów w naszej zmiennej
dane plus długość naszego wielomianu (9bitów)
minus jeden co daje łącznie 24 przesunięcia

rzecz jasna ostatnie 8 bitów jakie się wsuną to będą same zera.
po tej 24 operacji przesunięcia sprawdzamy co znajduje się aktualnie w naszej zmiennej
roboczej .
Powinna to być właśnie suma kontrolna identyczna z tą nadesłaną przez czujnik

podsyłam na szybko prosty kod przedstawiający metodę w akcji .
Był przygotowany w oparciu o zestaw ATB z atmega32A na pokładzie i bibliotekę do obsługi uart z BlueBook'a
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a tutaj jest jest biblioteka do funkcji crc8:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i plik nagłówkowy
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.