Pages: 1 ... 3 4 [5]   Go Down
Author Topic: Librerie per il calcolo del CRC16 e CRC32  (Read 4765 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 332
Posts: 22811
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Lo sketch di esempio è qui:
Code:
#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  smiley-wink

* crc8.zip (0.95 KB - downloaded 21 times.)
Logged


Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5962
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Io ho fatto prima, ho lasciato in C  smiley-twist e tramutato i tipi byte in char ... tanto, su operazioni bit-oriented ... non cambia praticamente nulla smiley-wink

Guglielmo
Logged

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 332
Posts: 22811
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5962
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

Guglielmo
Logged

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 332
Posts: 22811
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok. Ho capito la logica.
Logged


0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10473
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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()
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5962
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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 smiley-wink
« Last Edit: July 06, 2013, 02:40:34 am by gpb01 » Logged

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 332
Posts: 22811
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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*.
Logged


Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5962
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

... 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 ... smiley-lol smiley-mr-green smiley-lol smiley-mr-green smiley-lol

Guglielmo
Logged

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 332
Posts: 22811
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì, è la stessa. Uso byte perché è più corto a scrivere ma sappiamo che byte = unsigned char = uint8_t  smiley-wink
Logged


0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10473
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

btw uint8_t e famiglia sono nella libreria stdint.h
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: 1 ... 3 4 [5]   Go Up
Jump to: