Calcul de CRC
Répondre à la discussion
Affichage des résultats 1 à 20 sur 20

Calcul de CRC



  1. #1
    antoine6

    Calcul de CRC


    ------

    Bonjour à tous,

    Je cherche à identifier le protocole de transmission d'une télécommande de climatiseur (marque Atlantic/Fujitsu). Je suis capable de récupérer l'information transmise sous forme binaire, et j'ai pu identifier le rôle de chaque bits. Cependant, il semble y avoir en fin de trame un CRC/checksum, et je n'arrive pas à déterminer la méthode utilisée pour calculer.

    Les trames reçues ont une longueur de 128 bits (sans compter les bits de start et stop). Voici un exemple de trames où seule la commande de température varie (9ème octet). Le CRC est contenu dans le dernier octet.

    Code:
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 10000101 00100000 01000000 00000000 00000000 00000000 00000100 10010000
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00001101 00100000 01000000 00000000 00000000 00000000 00000100 01011111
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00001011 00100000 01000000 00000000 00000000 00000000 00000100 01011011
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000111 00100000 01000000 00000000 00000000 00000000 00000100 01010011
    J'ai essayé de faire une somme de chaque octets, ou un ou exclusif, en vain : le résultat obtenu est toujours différent de celui attendu. Le protocole envoie le bit de poids faible en premier. J'ai essayé dans le sens inverse, ça ne marche pas non plus.

    Des idées sur la méthode qui aurait pu être employée ?

    Merci d'avance.

    -----

  2. #2
    pilatomic

    Re : Calcul de CRC

    Pourrais-tu poster encore d'autres trames avec des valeurs de températures différentes ?

  3. #3
    antoine6

    Re : Calcul de CRC

    Ci-joint des trames en faisant varier un peu toutes les octets (la température, puis le type de fonctionnement, et finalement les alarmes).

    Code:
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 10000111 00100000 01000000 00000000 00000000 00000000 00000100 10010011
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00001011 00100000 01000000 00000000 00000000 00000000 00000100 01011011
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00001101 00100000 01000000 00000000 00000000 00000000 00000100 01011111
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000101 00100000 01000000 00000000 00000000 00000000 00000100 01010000
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00001001 00100000 01000000 00000000 00000000 00000000 00000100 01011000
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000001 00100000 01000000 00000000 00000000 00000000 00000100 01010100
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00001110 00100000 01000000 00000000 00000000 00000000 00000100 01011100
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000110 00100000 01000000 00000000 00000000 00000000 00000100 01010010
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00001010 00100000 01000000 00000000 00000000 00000000 00000100 01011010
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000010 00100000 01000000 00000000 00000000 00000000 00000100 01010110
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00001100 00100000 01000000 00000000 00000000 00000000 00000100 01011110
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100000 01000000 00000000 00000000 00000000 00000100 01010001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00001000 00100000 01000000 00000000 00000000 00000000 00000100 01011001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000000 00100000 01000000 00000000 00000000 00000000 00000100 01010101
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000000 00100000 01000000 00000000 00000000 00000000 00000100 01010101
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00000000 01000000 00000000 00000000 00000000 00000100 01110001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 10000000 01000000 00000000 00000000 00000000 00000100 10110001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 01000000 00000000 00000000 00000000 00000000 00000100 01110001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 11000000 01000000 00000000 00000000 00000000 00000100 11010001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100000 01000000 00000000 00000000 00000000 00000100 01010001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100000 11000000 00000000 00000000 00000000 00000100 10010001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100000 00100000 00000000 00000000 00000000 00000100 00010001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100000 00000000 00000000 00000000 00000000 00000100 00110001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100000 10000000 00000000 00000000 00000000 00000100 11010001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100100 10000000 01110100 10110000 00000000 00000100 00001100
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100100 10000000 00011100 10110000 00000000 00000100 01100100
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100100 10000000 11110110 10110000 00000000 00000100 11110111
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100100 10000000 10000000 00010000 00000000 00000100 01000110
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100100 10000000 10010100 00010000 00000000 00000100 01011100
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100100 10000000 11011010 00010000 00000000 00000100 00010000
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100100 10000000 11000001 00010000 00000000 00000100 00000111
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100100 10000000 01000001 10010000 00000000 00000100 00000111
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00101100 10000000 00000000 00001011 11001011 00000100 00011101
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00101100 10000000 00000000 00001000 11110011 00000100 00111110
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00101100 10000000 00000000 00000110 01010011 00000100 10001100
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00101100 10000000 00000000 00001000 10100011 00000100 01100001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00101100 10000000 00000000 00000011 11111101 00000100 00111011
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00101100 10000000 00000000 00001111 00111101 00000100 11110101
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100010 10000000 10000001 10011111 00111100 00000100 10101001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100000 10000000 00000000 00000000 00000000 00000100 11010001
    00101000 11000110 00000000 00001000 00001000 01111111 10010000 00001100 00000100 00100010 10000000 00100101 10011111 00111100 00000100 01001110

  4. #4
    invite66c1ab93

    Re : Calcul de CRC

    Bonjour,

    Le checksum se calcul à partir des valeurs en hexa.
    Tu peux aller voir http://www.zorc.breitbandkatze.de/crc.html (il y a bien sure plein d'autres sites).

    Il faut connaitre le polynom, je présume que tu ne le connais pas, essais avec les différents polynoms jusqu'à trouver le bon.
    Il me semble que le CRC peut être en 16 ou 32bits.

    Si tu arrives déjà à lire les données, quel est ton but de connaitre le calcul du CRC ?

    Mickael

  5. A voir en vidéo sur Futura
  6. #5
    antoine6

    Re : Calcul de CRC

    Citation Envoyé par MiKL.66 Voir le message
    Il faut connaitre le polynom, je présume que tu ne le connais pas, essais avec les différents polynoms jusqu'à trouver le bon.
    Il me semble que le CRC peut être en 16 ou 32bits.
    Qu'est-ce qui te fait dire cela ?

    Citation Envoyé par MiKL.66 Voir le message
    Si tu arrives déjà à lire les données, quel est ton but de connaitre le calcul du CRC ?
    Mon but est de pouvoir piloter la climatisation à distance. Sans CRC correct, la commande émise ne sera jamais acceptée par la clim.

  7. #6
    invite66c1ab93

    Re : Calcul de CRC

    Citation Envoyé par antoine6 Voir le message
    Qu'est-ce qui te fait dire cela ?
    Je ne suis pas sûre, mais je n'ai jamais rencontré de CRC en 8 bits ...
    à confirmer par d'autres personnes !

    Citation Envoyé par antoine6 Voir le message
    Mon but est de pouvoir piloter la climatisation à distance. Sans CRC correct, la commande émise ne sera jamais acceptée par la clim.
    Je comprends mieux.

    Avec quoi comptes tu piloter ta clim ?
    ... PC, µC (lequel) ?

  8. #7
    Biname

    Re : Calcul de CRC

    CRC8 existe, un CRC est une fonction assez simple à implémenter

    http://www.rajivchakravorty.com/sour...8c-source.html

    Code:
    00001 /*  
    00002  * crc8.c
    00003  * 
    00004  * Computes a 8-bit CRC 
    00005  * 
    00006  */
    00007 
    00008 #include <stdio.h>
    00009 
    00010 
    00011 #define GP  0x107   /* x^8 + x^2 + x + 1 */
    00012 #define DI  0x07
    00013 
    00014 
    00015 static unsigned char crc8_table[256];     /* 8-bit table */
    00016 static int made_table=0;
    00017 
    00018 static void init_crc8()
    00019      /*
    00020       * Should be called before any other crc function.  
    00021       */
    00022 {
    00023   int i,j;
    00024   unsigned char crc;
    00025   
    00026   if (!made_table) {
    00027     for (i=0; i<256; i++) {
    00028       crc = i;
    00029       for (j=0; j<8; j++)
    00030         crc = (crc << 1) ^ ((crc & 0x80) ? DI : 0);
    00031       crc8_table[i] = crc & 0xFF;
    00032       /* printf("table[%d] = %d (0x%X)\n", i, crc, crc); */
    00033     }
    00034     made_table=1;
    00035   }
    00036 }
    00037 
    00038 
    00039 void crc8(unsigned char *crc, unsigned char m)
    00040      /*
    00041       * For a byte array whose accumulated crc value is stored in *crc, computes
    00042       * resultant crc obtained by appending m to the byte array
    00043       */
    00044 {
    00045   if (!made_table)
    00046     init_crc8();
    00047 
    00048   *crc = crc8_table[(*crc) ^ m];
    00049   *crc &= 0xFF;
    00050 }
    Sans garantie

  9. #8
    antoine6

    Re : Calcul de CRC

    Citation Envoyé par MiKL.66 Voir le message
    Je ne suis pas sûre, mais je n'ai jamais rencontré de CRC en 8 bits ...
    Il y a seulement le dernier octect qui bouge. Ca serait donc un CRC avec un masque à la fin pour le ramener sur 8 bits.

    Citation Envoyé par MiKL.66 Voir le message
    Avec quoi comptes tu piloter ta clim ?
    ... PC, µC (lequel) ?
    Pour faire simple, un serveur web <> linux embarqué <> microcontrôleur <> transceiver infrarouge

    Au niveau du micro, c'est un PIC24 car je l'avais sous la main (http://en.wikipedia.org/wiki/Bus_Pirate). Mais du moment que j'ai un timer 16 bits et une UART, n'importe quel micro fait l'affaire.

    @Biname : je regarde ça, merci.
    Dernière modification par antoine6 ; 16/04/2013 à 17h24.

  10. #9
    invite66c1ab93

    Re : Calcul de CRC

    ça tombe bien, je travaille pas mal avec les PIC24.

    Par contre, je n'ai pas d'astuces à te proposer pour retrouver le polynom.
    Et sans le polynom, je suis incapable de t'aider plus ...

    Personnellement, j’essaie plusieurs polynom en utilisant les calculateurs sur les sites internet jusqu'à trouver le bon.
    Certes, ça prend beaucoup de temps.

    Je laisse la place à ce qui savent comment faire autrement ...

  11. #10
    Biname

    Re : Calcul de CRC

    Les fonctions CRC sont inclues dans tous les langages, ici un CRC8 pour 16F84 ... que GEPATOULU

    En cherchant avec 'CRC8 pic24' ou CRC-8 ... tu devrais trouver un code précuit ... voire d'origine Microchip ?

    Code:
    	list      p=p16f84
    	#include p16f84.inc
    
    
    ;===============================================================
    ;
    ;    CRC-8 for Dallas iButton products
    ;
    ;
    ;    From Maxim/Dallas AP Note 27
    ;
    ;    "Understanding and Using Cyclic Redundancy Checks with 
    ;    Dallas Semiconductor iButton Products"
    ;
    ;    The Ap note describes the CRC-8 algorithm used in the 
    ;    iButton products. Their implementation involves a 256 byte
    ;    CRC table. This algorithm is implemented here. In addition
    ;    two other algorithms are shown. One uses nibble arrays and
    ;    the other uses boolean arithmetic.
    ;
    ;    
    ;    18JAN03 - T. Scott Dattalo
    
    
      cblock	0x20
    
    	crc
    
      endc
    
      org 0
    
    	goto	start
    
    ;===============================================================
    crc_8:
    	xorwf	crc,f
    	clrw
    
    	btfsc	crc,0
    	xorlw	0x5e
    
    	btfsc	crc,1
    	xorlw	0xbc
    
    	btfsc	crc,2
    	xorlw	0x61
    
    	btfsc	crc,3
    	xorlw	0xc2
    
    	btfsc	crc,4
    	xorlw	0x9d
    
    	btfsc	crc,5
    	xorlw	0x23
    
    	btfsc	crc,6
    	xorlw	0x46
    
    	btfsc	crc,7
    	xorlw	0x8c
    
    	movwf	crc
    
    	return
    
    ;===============================================================
    start:
    
    	clrf	crc
    	movlw	1
    	call	crc_8	; crc = 0x5e
    
    	clrf	crc
    	movlw	2
    	call	crc_8	; crc = 0xbc
    
    	clrf	crc
    	movlw	4
    	call	crc_8	; crc = 0x61
    
    	clrf	crc
    	movlw	8
    	call	crc_8	; crc = 0xc2
    
    	clrf	crc
    	movlw	0x10
    	call	crc_8	; crc = 0x9d
    
    	clrf	crc
    	movlw	0x20
    	call	crc_8	; crc = 0x23
    
    	clrf	crc
    	movlw	0x40
    	call	crc_8	; crc = 0x46
    
    	clrf	crc
    	movlw	0x80
    	call	crc_8	; crc = 0x8c
    
      ; dallas example:
    
    	clrf	crc
    	movlw	0x02
    	call	crc_8	; crc = 0xbc
    
    	movlw	0x1c
    	call	crc_8	; crc = 0xaf
    
    	movlw	0xb8
    	call	crc_8	; crc = 0x1e
    
    	movlw	0x01
    	call	crc_8	; crc = 0xdc
    
    	movlw	0x00
    	call	crc_8	; crc = 0xf4
    
    	movlw	0x00
    	call	crc_8	; crc = 0x15
    
    	movlw	0x00
    	call	crc_8	; crc = 0xa2
    
    	movlw	0xa2
    	call	crc_8	; crc = 0x00
    
    	goto	start
    
      end

  12. #11
    terriblement

    Re : Calcul de CRC

    Au pire, tu peux te faire une look up table...
    Si j'ai bien compris, la communication est unidirectionnelle, donc ca doit etre faisable

  13. #12
    antoine6

    Re : Calcul de CRC

    J'ai regardé du coté du CRC8, avec tous les polynômes possibles, en en ne prenant qu'une partie des octets, ca ne marche pas. Plus qu'a regarder s'ils ne font pas un XOR à la fin, ou si le CRC est initialisé à une valeur non nulle.

    Citation Envoyé par terriblement Voir le message
    Au pire, tu peux te faire une look up table...
    Si j'ai bien compris, la communication est unidirectionnelle, donc ca doit etre faisable
    Qu'est-ce-que tu veut dire ? Faire une table qui donne le CRC pour chaque chaîne ? Ça oblige un apprentissage complet avec chaque combinaisons (14 températures * 4 modes de fonctionnement * 5 modes des ventilation * etc. = beaucoup !). Si je n'arrive pas à trouver la méthode de calcul du CRC, c'est ce que finirai par faire, en limitant le nombre de combinaisons.

  14. #13
    invite66c1ab93

    Re : Calcul de CRC

    Bonjour,

    Biname, dans l'exemple que tu donnes, on ne connait pas le polynom ... et sans connaitre le polynom, on est pas sure du résultat.

    Antoine6, il n'y a pas de raison de ne pas trouver la solution.
    Ta clim fonctionne, donc la trame est correcte.

    C'est dommage qu'il n'y a personne de plus calé qui se manifeste.

    Je vais essayer te t'aider à ma façon ...

    Peux tu m'expliquer comment tu fais pour entrer tes valeurs dans les calculateurs.
    Tu sais qu'il y a des systèmes qui fonctionne en Litle Endian et d'autres en Big Endian.

    Personnellement j'ai travaillé sur des communication MODBUS avec CRC 16 bits.
    Les bits ne sont pas dans l'ordre.
    Dans mon cas, un exemple d'octet reçu 00101111
    Cela nous donne en hexa 4F ... ce qui est étonnant c'est qu'il faut inverser et ça donne F4.

    Pour pouvoir te l'expliquer clairement, faudrait que je m'y remette ...
    Et je ne vais pas reprendre mon projet d'ici 2 à 3 semaines.

    J'espère que ça pourra t'aider un peu.
    Mickael

  15. #14
    antoine6

    Re : Calcul de CRC

    Citation Envoyé par MiKL.66 Voir le message
    Biname, dans l'exemple que tu donnes, on ne connait pas le polynom ... et sans connaitre le polynom, on est pas sure du résultat.
    Dans le fond ce n''est pas problématique, si c'est un polynôme sur 8 bits je peux le retrouver rapidement. Or j'ai passé en revu les 256 polynômes possibles, et le résultat ne correspond pas. Je vais chercher à partir de plus de données pour voir si j'arrive à trouver une solution (calculer le CRC en commençant par la fin, ...)

    Citation Envoyé par MiKL.66 Voir le message
    Peux tu m'expliquer comment tu fais pour entrer tes valeurs dans les calculateurs.
    Tu peux être un peu plus précis ?

    Citation Envoyé par MiKL.66 Voir le message
    Tu sais qu'il y a des systèmes qui fonctionne en Litle Endian et d'autres en Big Endian.
    Les octets sont bel et bien inversés : le bit de poids faible est à gauche, et celui de poids fort à droite. Les quartets ne sont pas inversés, du moins pour les deux octets correspondants aux timers.

  16. #15
    invite66c1ab93

    Re : Calcul de CRC

    Je n'ai pas toutes mes notes sous la main, mais en réfléchissant je disais peut être une bêtise ...
    Les valeurs sont à rentrer dans l'ordre normal dans les calculateurs.
    Essais de voir si tu ne trouves pas le bon résultat en inversant les quartets du CRC ?

  17. #16
    terriblement

    Re : Calcul de CRC

    Je comprends pas, tu appuies sur ta telecommande, on va dire mode 1:

    tu as ta trame et son CRC

    tu appuies sur "temperature +"

    tu as ta trame et son CRC

    etc...

    Ou bien, quand tu appuies sur "temperature +" la telecommande envoie :

    Temperature+ et mode 2 et ventilation 3 et ... ?
    ca me semblerait louche comme mode de fonctionnement.

  18. #17
    pilatomic

    Re : Calcul de CRC

    C'est pas forcément louche, les télécommandes de clim sont bien différentes des autres, il y a parfois même le capteur de température et l'électronique de régulation intégrée dans la télécommande !
    Le fait que la télécommande retransmette tout correspond bien au fonctionnement que j'avais observé sur certaine clim :

    Si on change la température de consigne et que la clim n'a pas reçu l'info ( télécommande cachée par exemple ), il suffisait d'envoyer n'importe quelle autre commande pour la température soit retransmise.

  19. #18
    antoine6

    Re : Calcul de CRC

    Citation Envoyé par terriblement Voir le message
    ca me semblerait louche comme mode de fonctionnement.
    Et encore c'est bref...

    Pour cette télécommande Fujitsu, un appui sur une touche correspond à une trame de 16 octets. Elle contient toutes les informations : température de consigne, mode de fonctionnement, réglage de la ventilation, des alarmes...

    Pour les télécommandes Daikin, il y a 3 blocs transmis, pour un total d'un peu plus de 32 bits.

    Comme le signale pilatomic, c'est assez logique. Si la télécommande se contentait d'envoyer seulement des ordres du genre "température +1", le simple fait que le récepteur loupe des trames déréglerait tout le système sans que l'on s'en aperçoive.

  20. #19
    Biname

    Re : Calcul de CRC

    Citation Envoyé par antoine6 Voir le message
    Et encore c'est bref...

    Pour cette télécommande Fujitsu, un appui sur une touche correspond à une trame de 16 octets. Elle contient toutes les informations : température de consigne, mode de fonctionnement, réglage de la ventilation, des alarmes...

    Pour les télécommandes Daikin, il y a 3 blocs transmis, pour un total d'un peu plus de 32 bits.

    Comme le signale pilatomic, c'est assez logique. Si la télécommande se contentait d'envoyer seulement des ordres du genre "température +1", le simple fait que le récepteur loupe des trames déréglerait tout le système sans que l'on s'en aperçoive.

    Un CRC n'est pas suffisant pour garantir l'intégrité de la transmission. Avec un CRC8 un erreur sur 256 passe.

  21. #20
    terriblement

    Re : Calcul de CRC

    ya ptetre encore une parité ligne/colonne (je sais plus le nom).

    Perso un fonctionnement traditionnel "temperature +1" m'irait mieux...

Discussions similaires

  1. calcul du CRC
    Par invite2763e394 dans le forum Électronique
    Réponses: 6
    Dernier message: 10/09/2011, 14h00
  2. calcul du CRC
    Par invite2763e394 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 09/09/2011, 17h46
  3. crc-12, crc-16, crc-ccitt
    Par invitee82b0ff8 dans le forum Électronique
    Réponses: 1
    Dernier message: 21/02/2011, 10h57
  4. calcul du crc
    Par invite86b63eff dans le forum Orientation après le BAC
    Réponses: 1
    Dernier message: 10/12/2009, 23h21
  5. calcul de CRC
    Par Costeed dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 10/04/2009, 21h11
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...