Go Down

Topic: Librerie per il calcolo del CRC16 e CRC32 (Read 6037 times) previous topic - next topic

leo72

Sì, è l'uso del C che gli rompe.
Ho tramutato tutto in C++ e funziona perfettamente.

Lo sketch di esempio è qui:
Code: [Select]
#include "crc8.h"

void setup() {
    byte myCrc8;
    Serial.begin(19200);
    delay(1000);
    myCrc8  = CRC8.calculate("123456789", 9);
    Serial.println("Calculate CRC on string 123456789");
    Serial.print("CRC8 = 0x");
    Serial.println(myCrc8, HEX);

}

void loop() {
}


la lib è come al solito (per i miei prodotti) GPL quindi potete farne quel che vi pare basta che rilasciate poi il vostro codice come GPL  ;)

gpb01


Sì, è l'uso del C che gli rompe.
...


Io ho fatto prima, ho lasciato in C  ]:D e tramutato i tipi byte in char ... tanto, su operazioni bit-oriented ... non cambia praticamente nulla ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

leo72

ROFTL  :smiley-yell:
Una cosa che mi era venuta in mente mentre modificavo il tuo codice. Tu avevi cambiato la mia lib per fargli ricevere in input un array di char. In questo caso puoi benissimo usare la precedente versione della mia funzione, quella che faceva il while con il test sul puntatore perché in questo caso si ha una stringa vera e propria che terminerà con \0 per cui while(*data) funziona senz'altro.

gpb01

No, perché in realtà non necessariamente gli passi una stringa ... con un bel cast (char *) gli dai in pasto qualunque puntatore quindi ... sempre meglio puntatore e lunghezza ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

leo72


lesto

bruttissima cosa l'uso del char, come puoi vedere ha già confuso anche leo.
Usa un puntatore void* (ovvero nessun tipo!) che si capisce subito che puoi dargli in pasto qualsiasi cosa!
il C è veramente un linguaggio con delle chicche mica da ridere.

Alla fine con puntatori void e puntatori a funzioni, diventa facile capire come sia possibile ottenere un liguaggio ad oggeti..

edit: per chiarire, l'uso di void proabilmente non ti risparmia il cast, ma è buona programmazione, vedi *alloc()
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

gpb01

#66
Jul 06, 2013, 09:26 am Last Edit: Jul 06, 2013, 09:40 am by gpb01 Reason: 1

bruttissima cosa l'uso del char, come puoi vedere ha già confuso anche leo.
...


Non sono d'accordo Lesto ...
... un pointer è un pointer e, specie in tutte le applicazioni in cui ti occorre solo l'accesso al byte per poter manipolare bit, char* spesso ti semplifica la vita. Sono decenni che lo uso e non ho mai avuto problemi ... né tantomeno "errate interpretazioni".

L'errore è quello di voler pensare il char ed il char*  solo legato a "caratteri" e a "stringhe di caratteri".

In realtà char è solo un tipo numerico di un byte segnato e char* altro non è che un puntatore a tale tipo. Che poi per comodità si sia deciso che una stringa di caratteri (es. "abcdefg") viene rappresentata con un numero N + 1 di char, in cui l'ultimo a 0x00, indica la fine di questa stringa, è solo una convenzione ;)

Guglielmo

P.S. : Volendo essere proprio pignoli, nel caso della crc8, il tipo giusto da usare sarebbe : unsigned char ... cioè un campo puro di un byte senza segno ;)
Search is Your friend ... or I am Your enemy !

leo72

Col void* il compilatore si incoccia e non poco dicendo che non può scorrere un puntatore a void con *xxx++.
Quindi la versione col casting è perfetta. L'ho provata ora e funziona perfettamente. Se poi si hanno da manipolare dati di valore maggiori di 127, basta mettere byte, come ho fatto nella mia versione originale e poi eventualmente castare con byte* invece di char*.

gpb01


... Se poi si hanno da manipolare dati di valore maggiori di 127, basta mettere byte, come ho fatto nella mia versione originale e poi eventualmente castare con byte* invece di char*.


Leo ... basta mettere ... unsigned char ... XD :smiley-mr-green: XD :smiley-mr-green: XD

Guglielmo
Search is Your friend ... or I am Your enemy !

leo72

Sì, è la stessa. Uso byte perché è più corto a scrivere ma sappiamo che byte = unsigned char = uint8_t  ;)

lesto

btw uint8_t e famiglia sono nella libreria stdint.h
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up