CRC...traduzione

Salve ,

per favore potete tradurre in linguaggio arduino … mi si incrociano gli occhi

Grazie.

INT16U cal_crc_half(INT8U far *pin, INT8U len)
{

	INT16U crc;

	INT8U da;
	INT8U far *ptr;
	INT8U bCRCHign;
    INT8U bCRCLow;

	INT16U crc_ta[16]=
	{ 
		0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,

		0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef
	};
	ptr=pin;
	crc=0;
	
	while(len--!=0) 
	{
		da=((INT8U)(crc>>8))>>4; 

		crc<<=4;

		crc^=crc_ta[da^(*ptr>>4)]; 

		da=((INT8U)(crc>>8))>>4; 

		crc<<=4;

		crc^=crc_ta[da^(*ptr&0x0f)]; 

		ptr++;
	}
	bCRCLow = crc;

    bCRCHign= (INT8U)(crc>>8);

	if(bCRCLow==0x28||bCRCLow==0x0d||bCRCLow==0x0a)

    {
    	bCRCLow++;
    }
    if(bCRCHign==0x28||bCRCHign==0x0d||bCRCHign==0x0a)

    {
		bCRCHign++;
    }
    crc = ((INT16U)bCRCHign)<<8;
    crc += bCRCLow;
	return(crc);
}

joele: per favore potete tradurre in linguaggio arduino .. mi si incrociano gli occhi

Non c'è niente da tradurre, è una funzione scritta in C e così deve rimanere se vuoi che funzioni.

p.s. Anche Arduino lo programmi in C/C++.

Grazie della risposta , io intendevo (tradurla) trascriverla nello sketch.. per poi richiamarla... Ma cosi come e' da errore

Grazie.

Devi cambiare gli alias del tipo dato con quelli riconosciuti da avr-gcc

INT16U con unsigned int INT8U con byte

Mi erano sfuggiti questi due:

INT8U far *pin INT8U far *ptr

Il far serve su i vecchi processori X86 con la memoria segmentata, sostituiscili con:

int *pin int *ptr

It's work!!

Grazie mille!

Mi pare che, o nel core di Arduino o nella toolchain avr, le funzioni crc ci siano già.

PaoloP:
Mi pare che, o nel core di Arduino o nella toolchain avr, le funzioni crc ci siano già.

Le avrlibc, che fanno parte di avr-gcc, contengono funzioni per il calcolo del CRC8 e CRC16 non sono documentate direttamente sul reference di Arduino, occorre consultare la documentazione delle avrlibc, comunque linkate dal reference.

Volendo ... c'era anche QUESTO mio post con i moduli che permettono di calcolare il CRC16 e il CRC32 ;)

Guglielmo

Ciao , @gpb01 ho trovato quel post , ho scaricato lo sketch , ma non mi restituiva il dato che mi aspettavo.. non so perche' magari il metodo per calcolare il crc e' diverso..non saprei. Il codice in c che ho postato chiedendone la traduzione (;D) mi e' stato dato direttamente dal produttore... del'aggeggino seriale...

Es. mettendo la stringa "QPI" nel tuo sketch mi restituisce 0x27AC In quello postato mettendo "0x51,0x50,0x49" mi restituisce 0xBEAC che e' corretto.

joele: Ciao , @gpb01 ho trovato quel post , ho scaricato lo sketch , ma non mi restituiva il dato che mi aspettavo.. non so perche' magari il metodo per calcolare il crc e' diverso..non saprei.

Semplicemente perché avranno usato un polinomio generatore diverso ... ;)

Basta andare a correggere il polinomio e l'algoritmo è ... sempre quello ... ma, senza offesa, valutando dalle domande che fai ... probabilmente non sapresti dove mettere le mani :D ... quindi [u]usa quello del produttore[/u] :)

Guglielmo

gpb01:

joele: Ciao , senza offesa, valutando dalle domande che fai ... probabilmente non sapresti dove mettere le mani :D :)

Guglielmo

Per l'appunto.. l'elettronica e' il mio lavoro , ma l'nformatica e' una passione!

Ma quale offesa!!! Se sapevo sbrogliarla che stavo qui??

Grazie della disponibilita'

Nella discussione che ti ha linkato trovi anche un semplicissimo CRC8 che ho sviluppato io, per applicazioni dove non è richiesta una eccessiva sicurezza, è una valida alternativa alle somme di controllo a 16 e 32 bit.