CRC i sumy kontrolne (Modbus CRC16, CRC32)
Wklej bajty ramki, a dostaniesz sumy kontrolne i ramkę z dopisanym CRC, gotową do wysłania przez port szeregowy.
Wynik
- Bajty CRC w ramce (najpierw młodszy)
- C5 CD
- Liczba bajtów danych
- 6
01 03 00 00 00 0A C5 CD
:01030000000AF2\r\n
| Algorytm | hex | dziesiętnie |
|---|---|---|
| CRC-16/MODBUS | 0xCDC5 | 52677 |
| CRC-16/IBM-3740 (CCITT-FALSE) | 0x0428 | 1064 |
| CRC-16/XMODEM | 0x0A38 | 2616 |
| CRC-16/KERMIT | 0xB6BD | 46781 |
| CRC-16/ARC | 0xD6C5 | 54981 |
| CRC-32 (ISO-HDLC) | 0xDDEBE1C8 | 3723223496 |
| CRC-32C (Castagnoli) | 0x9BCB8F5F | 2613808991 |
| CRC-8/SMBUS | 0xB9 | 185 |
| LRC (Modbus ASCII) | 0xF2 | 242 |
| XOR (BCC) | 0x08 | 8 |
| Suma mod 256 | 0x0E | 14 |
| Suma mod 65536 | 0x000E | 14 |
Modbus RTU wysyła CRC na końcu ramki, najpierw młodszy bajt. Parametry algorytmów zgodne z katalogiem CRC RevEng.
CRC w Modbus RTU
Modbus RTU używa algorytmu CRC-16/MODBUS: wielomian 0x8005 w odwróconej postaci (0xA001), wartość początkowa 0xFFFF. Dwa bajty CRC dopisuje się na końcu ramki, najpierw młodszy. Przykład: zapytanie o 10 rejestrów od adresu 0 do urządzenia nr 1 to 01 03 00 00 00 0A, jego CRC to 0xCDC5, więc ramka kończy się bajtami C5 CD.
LRC w Modbus ASCII
W Modbus ASCII zamiast CRC jest LRC: suma bajtów adresu, funkcji i danych modulo 256, zanegowana (uzupełnienie do dwóch). Ramka zaczyna się dwukropkiem, bajty są zapisane jako znaki hex, a kończy ją CR LF.
Który CRC wybrać?
Jeśli dokumentacja urządzenia podaje tylko „CRC16”, porównaj wynik ze znaną ramką: różne odmiany CRC-16 dają różne wyniki dla tych samych danych. Sprawdzeniem każdego algorytmu jest jego wynik dla tekstu „123456789”, np. 0x4B37 dla CRC-16/MODBUS i 0xCBF43926 dla CRC-32.
Potrzebujesz więcej?
Kalkio liczy to, co najczęściej potrzebne. Do bardziej zaawansowanych zadań polecamy:
- CRC RevEng – Catalogue of CRC algorithms – parametry ponad stu odmian CRC z wartościami kontrolnymi
- CyberChef – setki przekształceń danych łączonych w łańcuch: kodowania, sumy kontrolne, kompresja (działa w przeglądarce)
Częste pytania
Dlaczego mój CRC ma bajty w odwrotnej kolejności?
Modbus RTU wysyła CRC od młodszego bajtu. Wartość 0xCDC5 trafia do ramki jako C5 CD. Kalkulator pokazuje obie postacie.
Czy wpisać adres urządzenia do danych?
Tak. CRC liczy się z całej ramki: adresu urządzenia, kodu funkcji i danych, bez samych bajtów CRC.