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)
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:
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 ...
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
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 ? ? ?
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 ... :