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 po stronie PC i uP - różnice w obliczeniach.

11 Maj 2017 21:43 1023 5
  • Poziom 13  
    Cześć,
    siedzę już dość długo nad pewnym probemem, otóż próbuję przesłać z xmegi ramkę danych z obliczonym CRC16 i następnie obliczyć CRC po stronie PC korzystając z tego samego algorytmu.
    Oto algorytm po stronie uP:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    I po stronie PC (visual c#):
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    W PC podaję do tej funkcji ramkę danych wraz z dwoma dodatkowymi bajtami CRC16 i jak rozumiem po to odejmuję od długości łańcucha 2 w zmiennej for, czy tak?
    W każdym razie składam te bajty do siebie i nijak nie wychodzi to samo. Czy te algorytmy są w ogóle identyczne? Ja różnicy nie widzę, ale może niech ktoś z Was Mądrzejszych spojrzy :)
    Proszę uprzejmie o odpowiedź i pozdrawiam.
  • Poziom 13  
    Dziękuję za źródła :)
    Pod C wprowadziłem małe zmiany, mianowicie zmieniłem niektóre typy danych w funkcjach. Kod wygląda tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Przykładowe wywołanie:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Co daje wynik crc = 27266. Co więcej, wynik jest tożsamy z wynikiem jaki daje potraktowanie tego stringa funkcją z mojego pierwszego posta, mianowicie z
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po stronie C# mam problem, gdyż nie dostaję tego samego. Kod funkcji i wywołanie:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Wywołanie:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Co daje wynik 5355.

    Po stronie C# zakomentowałem crc = 0 i włączyłem crc = 0xffff gdyż po stronie C jak widzę CRC_INIT = 0xFFFF.
    Poza tym zauważyłem, że tablice crc_table mają inne wartości. Czy tak powinno być?
    Czy może jednak tu jest błąd (?):
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Próbowałem xorować z różnymi wartościami jak i z początkowym crc = 0 i wynik ciągle nie jest ten sam. Co znowu robię źle? :)
  • Poziom 13  
    No zgadza się, sprawdzałem w międzyczasie z tymi samymi tabelami a i tak nie wychodziło to samo. Jak ma się sprawa z tym xorowaniem na końcu funkcji?

    Dodano po 5 [godziny] 44 [minuty]:

    U mnie jak zwykle wszystko na opak i zamiast zajrzeć tu na początku - zajrzałem na końcu... http://www.modbustools.com/modbus_crc16.htm
    Odwołałem się do tej strony po to by sprawdzić czy to co liczę jest prawidłowe. I dla tego stringa z przykładowych kodów ode mnie wyżej rzeczywiście poprawna jest wartość 27266. Czyli to co wychodzi z mojej funkcji dla języka C z pierwszego postu, oraz z funkcji Kolegi michciora dla języka C. Dla C# nie wychodziło mi nic. Do momentu aż nie zajrzałem na stronę modbusa z linka wyżej.
    Podsumowując, wstawiam działające kody do obliczania crc dla modbus przygotowane pod język C oraz C#.

    Język C: (w C dla AVR'ów unsigned short int zamienić na uint16_t)
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Język C#:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Prosiłbym jednak kogoś Mądrzejszego żeby jeszcze rzucił okiem - i w razie czego krzyknął :) - szczególnie na C#, gdyż tym językiem posługuję się od bardzo niedawna :)
  • Poziom 13  
    Dopytam jeszcze korzystając z wątku nt. CRC - dlaczego w modbus'ie ASCII liczymy LRC a nie CRC? Przecież zasadniczo ASCII to są liczby, więc CRC można dla takiej ramki bez problemu policzyć. Skąd ta różnica w podejściu?