Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

CRC16 i różnice w obliczeniach.

16 Mar 2017 23:09 636 4
  • Poziom 13  
    Cześć,
    mam problem z CRC16. Otóż mam taką paczkę danych:
    0x01 0x01 0x00 0x13 0x00 0x25
    i klikając w realtermie +crc Modbus16 oblicza mi takie CRC dla tych danych: 0x0C14.

    Korzystając z tego kodu (https://www.elektroda.pl/rtvforum/viewtopic.php?p=7491606#7491606):
    Kod: c
    Zaloguj się, aby zobaczyć kod

    dostaję wynik 0x0C15.
    Powyższą funkcję wywołuję w taki sposób:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    , przy czym w uart_RX_buffer znajduje się te 5 bajtów, które podałem na początku posta.

    Nie mogę znaleźć źródła problemu. Co robię źle? :) Proszę uprzejmie o wskazówki i pozdrawiam.

    Dodano po 50 [sekundy]:


    Odnośnie xora przy argumencie:
    Czy chodzi o to (?):
    crc ^= (uint16_t)*buf;
    Bo jeśli tak to dalej to samo.

    Dodano po 18 [minuty]:

    Jedna rzecz właśnie mi się rzuciła w oczy, mianowicie linijka:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    czy nie powinienem odejmować od rozmiaru badanej tablicy jednej pozycji, ale dopiero na końcu operacji? W tym momencie pętla kręci się 4 razy, a nie 5. Jak dodałem +1 do rozmiaru w kodzie funkcji, czyli po pierwszym odjęciu miałem dalej to co podałem w argumencie to wynik się zgadza.
  • Pomocny post
    Poziom 42  
    Daj dekrementację size za warunek pętli (np na jej końcu) i przekaż ilość elementów (6). Poprawny wynik to 140C (nie 0C14)

    (0C15 to CRC dla sytuacji bez ostatniego elementu przesłanej tablicy).
  • Poziom 13  
    I rzeczywiście, teraz wychodzi 140C. A jak to powinno wyglądać w modbusie w takim razie? Zarówno realterm jak i simply modbus master 8.0.6 crc przedstawiają jako 0C 14. W modbusie przestawia się bajty crc?
  • Poziom 13  
    Ok, wszystko działa już jak powinno, temat zamykam. Dziękuję za pomoc i pozdrawiam :)