Suma kontrolna CRC

0

Witam
Mam od kilku dni pewien problem. Robie komunikację z pewnym urządzeniem które wysyła do mnie informacje o jego stanie (kilka przykładów):
"\n040 3 210.3 0.02 5 236.2 0.56 5 27 8 ô 2002IN\r"
"\n
040 3 210.3 0.00 0 235.8 0.56 0 27 8 í 2002IN\r"
"\n040 3 124.9 0.73 91 237.9 0.46 87 31 286 _ 2002IN\r"
"\n
040 3 124.9 0.69 86 237.7 0.45 83 31 286 a 2002IN\r"
"\n*040 3 124.9 0.62 78 238.5 0.44 75 31 286 Z 2002IN\r"
Suma kontrolna dla kolejnych ramek to ô, í, _, a - czyli przedostatni parametr. W dokumentacji wyczytałem że obliczanie sumy kontrolnej rozpoczyna się od * a następnie kończy na ostatnim pustym znaku przed sumą kontrolną.
z dokumentacji mam rónież informację:
CRC16 = ~Calculated_CRC16 & 0xffff;
wzór obliczenia “0x8408” (HEX) - x16 + x12 + x5 + 1
jak to zrozumieć?

W dokumentacji był również link do strony na której można sprawdzić obliczanie CRC ale jakoś nie mogę dojść jakiego dokładnie algorytmu używają
http://zorc.breitbandkatze.de/crc.html

sprawdzałem następujące sumy kontrolne:
Modbus, XModem, crc_ccit prosta suma kontrolna (suma wszystkich bajtów) innych pomysłów już nie mam. myślałem, że strona rozwiąże moje wątpliwości ale nadal nic. Spotkał się ktoś z was już z taką dziwną sumą kontrolną? Wie ktoś może jak to policzyć

0

Ja zgaduje ze ta twoja suma kontrola to standardowo:
Suma wszystkich 2 bajtowych kawałków (!) przycięta do tej maski którą masz podaną. Podkreslam tutaj że nie chodzi o sumę wartości pojedynczych bajtów a słów o dlugości 2 bajtów (stąd 16 w nazwie ;) ). Ewentualnie może być tu jeszcze problem endianness, tzn może być konieczny byte-swap na tych słowach. Najprościej byłoby gdybyś podał tutaj przykład ciągu bajtów i sumę kontrolną która powinna z tego wyjść ;]

0

ciąg bajtów otrzymanych z urządzenia: "\n040 3 124.9 0.62 78 238.5 0.44 75 31 286 Z 2002IN\r"
według dokumentacji obliczanie mam zacząć od "
" a kończąc na ostatnim znaku przed sumą kontrolną " ". Suma kontrolna to "Z". Delikatnie mówiąc nie mam już pojęcia jak to dziadostwo policzyć.

wykorzystując wzór "“0x8408” (HEX) - x16 + x12 + x5 + 1" jak mam go teoretycznie rozumieć?
co oznacza X16? X12 itd.?

0

A mógłbyś łaskawie napisać ten ciąg bajtów w normalny sposób? Tzn jako wartości hexadecymalne kolejnych bajtów? Bo ta tekstowa reprezentacja jest niejednoznaczna bo wynika z użytego kodowania.
Jeśli nie rozumiesz co znaczy ten "wzór" to znaczy ze NIC na ten temat nawet nie próbowałeś doczytać.
http://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks

0

Dzięki za linka.
już czaje, że "x16 + x12 + x5 + 1" oznacza po prostu 0x8408 ale nadal nie do końca mi ten wzór mówi w jaki sposób policzyć sumę kontrolną. Szukałem głównie gotowego rozwiązania,które leżało praktycznie obok mnie. Zacząłem sugerować się dokumentacją, która tylko wprowadza zamieszanie. Najgorsze, że producent nie chce udzielić żadnych informacji i tylko odsyła do instrukcji.

no to się zdenerwowałem :P
ramka "\n*040 3 124.9 0.62 78 238.5 0.44 75 31 286 Z 2002IN\r" jest uszkodzona nie wiem w którym miejscu.
przykład poprawnej ramki w hex:

"0A2A30373020202035203431352E362020302E3935202020333936203233382E372020312E3730202020333830202033372020203230333320972034323032494E0D"
CRC ma wartość 0x97
wyważałem otwarte drzwi! Suma kontrolna to zwykła suma bajtów.
Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1