logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

CRC16 z biblioteki avr-libc, funkcja<util/crc16.h>

tomekl85 05 Sty 2010 20:44 4111 5
REKLAMA
  • #1 7490762
    tomekl85
    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:

    #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
  • REKLAMA
  • #2 7490791
    tmf
    VIP Zasłużony dla elektroda
    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.
  • REKLAMA
  • #3 7490865
    Father
    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...
  • REKLAMA
  • REKLAMA
  • #5 7491606
    michalko12
    Specjalista - Mikrokontrolery
    tomekl85 napisał:

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



    Funkcja licząca CRC ramki MODBUS

    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;    	
    }
  • #6 7492334
    tomekl85
    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.
REKLAMA