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.

Problem z C i CRC

24 Wrz 2004 09:41 1508 3
  • Poziom 12  
    Witam
    potrzebuję wykonać obliczenia CRC do modbasu w bascomie, ale chciałbym zrobić to za pomocą tablicy. znalazłem przykład na elektrodzie:
    https://www.elektroda.pl/rtvforum/topic99019.html
    ale niestety jest w języku C a ja go nie znam.
    Sięgnąłem po książke do C ale pomimo to nie jest dla mnie wszystko wiadome.
    czy mógłby mi kotoś pomóc w analizie kodu??
    i sprawdzić moje domysły


    static prog_char auchCRCHi[256] = //deklaracja tablicy auchCRCHi
    {
    0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
    .
    .
    0x80,0x41,0x00,0xc1,0x81,0x40
    };

    static prog_char auchCRCLo [256] = //deklaracja tablicy auchCRCLo
    {
    0x00,0xc0,0xc1,0x01,0xc3,0x03,0x02,0xc2,0xc6,0x06,
    .
    .
    0x43,0x83,0x41,0x81,0x80,0x40
    };


    unsigned int CRC16 (unsigned char *puchMsg,unsigned char usDataLen) (początek procedury
    *puchMsg <- wskaźnik piwerwszej danej do obliczenia CRC
    usDataLen <- zmienna ilości danych do obliczenia CRC)

    {
    static unsigned char uIndex=0; (utworzenie zmiennej uIndex z jednoczesnym jej wyzerowaniem)
    static unsigned char uchCRCHi; (utworzenie zmiennej uchCRCHi)
    static unsigned char uchCRCLo; (utworzenie zmiennej uchCRCLo)
    uchCRCHi=0xff; (przypisanie wartości zmmiennym)
    uchCRCLo=0xff; (czemu nie zostały nadane im wartości zaraz przy deklaracji czy jest jakiś tego powód??)

    (pętla while będzie wykonywana dopóki nie zostanie obliczone CRC wszystkich danych)
    while (usDataLen --)
    {
    uIndex = uchCRCHi ^ *puchMsg++; (wyliczenie uIndex=uchCRCHi XOR dana do obliczenia CRC wskazywana przez wskaźnik)
    (mam nadzieję że się nie mylę i "^" jest operatorem XOR)


    uchCRCHi = uchCRCLo ^ PRG_RDB(&auchCRCHi[uIndex]); (obliczenie uchCRCHi=uchCRCLo XOR dana odczytana z tabeli auchCRCHi o numerze uIndex) niewiem co to jet "PRG_RDB" i czemu przed "auchCRCHi" jest znak "&" iloczynu logicznego)

    uchCRCLo = PRG_RDB(&auchCRCLo [uIndex]); (obliczenie uchCRCLo)
    }
    return (uchCRCHi<<8 | uchCRCLo); (zwrócenie wartośći CRC 16bitowe)

    Będę wdzięczny za wszelką pomoc
    Pozdrawiam
    J.S.
  • Poziom 29  
    PRG_RDB jest funkcją czytającą z pamięci programu (flash), w basicu to będzie pewnie LOOKUP, jeśli tablice auchCRCloi hi umieścisz w data,
    &coś to adres cosia
    ^ to xor
  • Poziom 12  
    Dzięki
    Działa wszystko jak trzeba
  • Poziom 2  
    mi niestety wyskakuja bledy przy kompilacji:
    Error[Pe020]:identifier "prog_char" is undefinder
    oraz
    Warning[Pe223]: function "PRG_RDB" declared implicitly