Corretta dichiarazione CRC8

Salve ragazzi, volevo implementare nel mio progetto che prevede una comunicazione bluetooth la funzione per il calcolo CRC8, come suggerito da gpb01 in unaltro mio topic.
questo di seguito è il codice che ho pensato possa funzionare.

//CRC-8 - algoritmo basato sulle formule di CRC-8 di Dallas/Maxim
//codice pubblicato sotto licenza GNU GPL 3.0
byte CRC8(const byte *data, byte len) {
  byte crc = 0x00;
  while (len--) {
    byte extract = *data++;
    for (byte tempI = 8; tempI; tempI--) {
      byte sum = (crc ^ extract) & 0x01;
      crc >>= 1;
      if (sum) {
        crc ^= 0x8C;
      }
      extract >>= 1;
    }
  }
  return crc;
}

byte byteCrc[] = {100, 200, 150};
byte valCrc;

void setup() {
  valCrc = CRC8(byteCrc, 3);
}

void loop() {
  
}

al momento non ho con me il mio fidato UNO (ecco perché non è implementata la Serial per contemplare il risultato).

Il codice compila senza errori, ma mi viene un dubbio precisamente qui

valCrc = CRC8(byteCrc, 3);

quel 3 dopo la virgola che indica "len" nella funzione CRC8 non dovrebbe essere 2 e non 3? dal momento in cui anche lo 0 indica la posizione di un dato in un array...

Il while viene eseguito esattamente len volte, quindi se l'array dati di partenza è lungo 3 va bene.

Non entro nel merito del calcolo del CRC visto che ce ne sono di molti tipi, basta usarne uno identico sia in trasmissione che in ricezione.

Nota che il CRC non garantisce al 100% l'integrità dei dati (con 4 byte dati ci sono 16 milioni di combinazioni possibili che danno lo stesso valore di CRC8), ma è finora il sistema che probabilisticamente individua meglio gli errori che avvengono lungo un canale di comunicazione (perché è difficile che un disturbo casuale trasformi tutti i bit di una configurazione valida in un'altra configurazione valida... CRC compreso)

Grazie Claudio intanto per la risposta.

Nota che il CRC non garantisce al 100% l'integrità dei dati

il CRC in generale o il CRC8 nello specifico? usando il 16 o il 32 cambierebbe la situazione? Sono domande per sviscerare un po il CRC.
Ps: gpb01 ho scaricato anche il tuo zio crc16 e crc32 ma nella compilazione da un errore che adesso non ricordo...

miky_police:
Ps: gpb01 ho scaricato anche il tuo zio crc16 e crc32 ma nella compilazione da un errore che adesso non ricordo...

Mmmm ... da dove lo hai scaricato ? Perché, verificato adesso con IDE 1.8.5, NON da alcun errore.

Guglielmo

miky_police:
Grazie Claudio intanto per la risposta.il CRC in generale o il CRC8 nello specifico? usando il 16 o il 32 cambierebbe la situazione? Sono domande per sviscerare un po il CRC.

Ovviamente, più il calcolo polinomiale si fa complesso, maggiore è la sicurezza sul controllo ...

Guglielmo

Come dice Claudio, ci sono 3 byte nell'array, per cui la sua lunghezza è 3. Come sono numerati è un problema successivo e relativamente indipendente.

Comunque tenete presente che di algoritmi crc ce ne sono un po' già implementati e pronti da usare nella avr libc: Microchip Docs

SukkoPera:
Comunque tenete presente che di algoritmi crc ce ne sono un po' già implementati e pronti da usare nella avr libc: http://www.microchip.com/webdoc/AVRLibcReferenceManual/group__util__crc.html

Di CRC ne trovi quanti ne vuoi ovunque :smiley: ...
... io ho cercato di limitare l'uso della SRAM mettendo le tavole in PROGMEM :wink:

Guglielmo

gpb01:
Mmmm ... da dove lo hai scaricato ? Perché, verificato adesso con IDE 1.8.5, NON da alcun errore.

Guglielmo

da qui.
Ho visto in un tuo post dell'anno scorso che hai allegato di nuovo il file compresso per il calcolo crc. ma questo non si chiama crc.zip ma CRC.zip
Ci sono differenze? io ho scaricato e provato il primo, quello a cui ti rimanda il link, il secondo l'ho appena scaricato e non ancora testato.. Appena rientro da lavorare (all'1 stanotte) lo provo :smiley:

miky_police:
Ho visto in un tuo post dell'anno scorso che hai allegato di nuovo il file compresso per il calcolo crc. ma questo non si chiama crc.zip ma CRC.zip

Ma mica pretenderai che mi ricordo cosa ho allegato cinque anni fa vero ? ? ? :smiling_imp:

Magari il vecchio era per il vecchio IDE, poi, ad un certo punto, hanno cambiato la sintassi per la dichiarazione delle variabili in PROGMEM e magari l'ho ripubblicato aggiornato ... boh ... ::slight_smile:

Guglielmo

:smiley: :smiley:
ti faccio sapere a breve :smiley: