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 z biblioteki avr-libc, funkcja<util/crc16.h>

05 Sty 2010 20:44 3595 5
  • Poziom 10  
    Witam,
    Próbuje zaimplementować crc16, korzystając z biblioteki avr-libc, z funkcji <util/crc16.h>

    opis tej funkcji to:
    avr/crc16.h

    Zawiera funkcje obliczające 16 bitowe CRC.

    unsigned int _crc16_update(unsigned int __crc, unsigned char __data)
    Oblicza 16 bitowe CRC według standardu CRC16 (x^16 + x^15 + x^2 + 1).


    Robie to tak:

    Code:
    #include <util/crc16.h>
    
    .
    .
    unsigned  int crc=0;
    unsigned char data[] = { 0x02, 0x1c, 0xb8, 0x01, 0, 0, 0, 0xa2 };
    crc=_crc16_update(crc,data);
    .
    .



    Kompilacja zwraca mi:
    ../modbus.c:197: warning: passing argument 2 of '_crc16_update' makes integer from pointer without a cast

    Nie wiem czy te ostrzeżenia są bardzo znaczące czy mogą zostać
    Narazie nie mam jak sprawdzić czy działa, bo program będę mogł wgrać w procka dopiero w weekend, a do tego czasu potrzebuje miec prawie działający program.
    Czy ktoś używał tej funkcji, działa poprawnie? Prosze o opinie i porady.
    Pozdrawiam
  • Moderator Mikrokontrolery Projektowanie
    Jezeli masz tablice:
    unsigned char data[] = { 0x02, 0x1c, 0xb8, 0x01, 0, 0, 0, 0xa2 };
    to do funkcji mozesz przekazywac tylko jej elementy, np. data[0], data[1], ty natomiast probujesz przekazac wskaznik do tablicy.
  • Poziom 26  
    Jeśli drugi argument funkcji (unsigned char __data) nie jest wskaźnikiem to powinno być raczej crc=_crc16_update(crc,data[i]); gdzie i=0...7 oraz crc jest wynikiem poprzedniego wywołania tej funkcji...
  • Poziom 16  
    Czyli innymi słowy: musisz zrobić pętlę:

    Code:

    for(i=0;i<7;i++)
    {
      crc = _crc16_update(crc, data[i]);
    }
  • Specjalista - Mikrokontrolery
    tomekl85 napisał:

    Czy ktoś używał tej funkcji, działa poprawnie? Prosze o opinie i porady.



    Funkcja licząca CRC ramki MODBUS

    Code:
    unsigned short ModbusCRC(unsigned char * buf, int size)
    
    {
       unsigned short crc = 0xffff;     
       int i;
         
       while(size--)   
       {     
          crc ^= *buf;
          buf++;
          for(i=0; i<8; i++)   
           {              
             if(crc & 1)
             {
                crc >>= 1;
                crc ^= 0xA001;
             }
             else
             {
                crc >>= 1;
             }
          }     
       }     
       return crc;       
    }
  • Poziom 10  
    Dziękuje bardzo za szybką odpowiedź, bardzo mi pomogliście. Rozumiem, że wynik będzie postaci np 0xD492, czyli pierwszym bajtem crc bedzie D4, a drugim 92.