
Cheksum,CRC?..
#1
Posté 07 avril 2013 - 02:17
Dans ce cadre les messages émis par le PC sont essentiellement des ordres sur un petit nombre d'octets (moins de 10) . La validation d'un message reçu nécessite au moins un contrôle ne serait ce que CRC.
J'ai sous la main plusieurs algos et peut être que la communauté en connait des mieux, faciles et fiables.
Voilà celui (très simple) utilisé (imposé) par le module Saber
fputc((adrSaber + Cde + speed) & 0b01111111,SABER);
C'est ma question donc : comment validez vous les messages reçus ?
http://hmnrobots.blogspot.fr/
#2
Posté 07 avril 2013 - 03:51
J'ai reçu mes nouveaux processeurs (16f767) et je dispose maintenant de plein de mémoire. Donc j'ajoute du code et je me penche maintenant sur la transmission des ordres radio (qui ne sert actuellement quasiment que dans le sens tondeuse-PC pour savoir ce qu'elle fait).
Dans ce cadre les messages émis par le PC sont essentiellement des ordres sur un petit nombre d'octets (moins de 10) . La validation d'un message reçu nécessite au moins un contrôle ne serait ce que CRC.
J'ai sous la main plusieurs algos et peut être que la communauté en connait des mieux, faciles et fiables.
Voilà celui (très simple) utilisé (imposé) par le module Saber
fputc((adrSaber + Cde + speed) & 0b01111111,SABER);
C'est ma question donc : comment validez vous les messages reçus ?
Perso, J'utilise souvent un simple bit de parité : Pour (N-1) bits transmis, le N° correspond à un bit de parité. Si dans les (N-1) premier bits, il y a un nombre paire de bit à 1, alors le bit de parité vaut 0, sinon, il vaut 1.
Si tu codes en assembleur, c'est souvent simple à faire.
Sinon, si tu utilises du C pour programmer, tu manipules des octets entiers bien souvent. Donc il vaut mieux trouver quelque chose de plus simple.
Je vais te donner une méthode que j'ai inventé. Je ne sais pas si elle est fiable mathématiquement, mais ça a l'air de bien marcher ^^
Le CRC est sur 1octet.
Le message à tester est sur N octets.
Je fais un XOR des N octets, ça me donne le CRC.
Pour tester si le CRC est valide, il suffit de faire un XOR des N octets et du CRC et de vérifier que le résultat vaut bien 0
Exemple. Si je transmet la chaine suivante : 0x0F 0x55 0x96 0x59
Je fais un XOR de ces 4 octets, ce qui me donne le CRC qui vaut 0x95
Je transmet ce CRC à la suite des 4 octets.
Lors de la réception, j'obtient 5 octets. Je sais que le dernier est le CRC et les 4 premiers, les données.
Je fais un XOR des 5 octets (pas que des 4) et si j’obtiens 0x00, c'est que tout s'est bien passé

Mon site internet : http://ferdinandpiette.com/
#3
Posté 07 avril 2013 - 04:50
Je vais te donner une méthode que j'ai inventé. Je ne sais pas si elle est fiable mathématiquement, mais ça a l'air de bien marcher ^^
Le CRC est sur 1octet.
Le message à tester est sur N octets.
Je fais un XOR des N octets, ça me donne le CRC.
Pour tester si le CRC est valide, il suffit de faire un XOR des N octets et du CRC et de vérifier que le résultat vaut bien 0
Exemple. Si je transmet la chaine suivante : 0x0F 0x55 0x96 0x59
Je fais un XOR de ces 4 octets, ce qui me donne le CRC qui vaut 0x95
Je transmet ce CRC à la suite des 4 octets.
Lors de la réception, j'obtient 5 octets. Je sais que le dernier est le CRC et les 4 premiers, les données.
Je fais un XOR des 5 octets (pas que des 4) et si j'obtiens 0x00, c'est que tout s'est bien passé/>
En cherchant un peu, j'en ai trouvé pas mal dont un exemple :
// Computation of CRC-7 0x48 polynom (x**7 + x**3 + 1), Used in MMC commands and responses. unsigned int8 crc (char *data, unsigned int8 length) { unsigned int8 i, ibit, c, crc; crc = 0x00; // Set initial value for (i = 0; i < length; i++, data++) { c = *data; //printf("0x%x,",c); for (ibit = 0; ibit < 8; ibit++) { crc = crc << 1; if ((c ^ crc) & 0x80) crc = crc ^ 0x09; // ^ is XOR c = c << 1; } crc = crc & 0x7F; } shift_left(&crc, 1, 1); // MMC card stores the result in the top 7 bits so shift them left 1 // Should shift in a 1 not a 0 as one of the cards I have won't work otherwise return crc; }
Mais ta méthode est vraiment intéressante, simple. Une fois encore, le calcul de la fiabilité m'échappe !
Merci bien
Modifié par Black Templar, 07 avril 2013 - 06:16 .
Ajout des balises [code]
http://hmnrobots.blogspot.fr/
1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users