IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Calcul CRC 11bits


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 140
    Par défaut Calcul CRC 11bits
    Bonjour à tous,

    J'espère ne pas m'être trompé de section de forum pour poser ma question.

    Ma problématique est la suivante :
    Je cherche à trouver le CRC qui sera appliqué à la trame de donnée suivante :
    Trame de donnée : 1100 0000 0100 1001 0000

    Mon polynôme générateur est du type :
    x^11 + x^9 + +x^8 + x^7 + x^2 + 1

    En cherchant sur divers sites internet, j'ai utilisé les méthodes décrite et je trouve un CRC de la valeur : 0x683.

    Je suis censé trouver une valeur de 0x3FC.

    Peut-être n'ai-je pas utilisé la bonne méthode pour cela. Pouvez-vous m'éclaire sur un moyen de calculer ce CRC de manière correcte?

    En vous remerciant d'avance,

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 140
    Par défaut
    Pour plus de précision sur mon calcul.

    D'après les méthodologies trouvé sur internet, il faut ajouter à la trame de donnée le nombre de '0' équivalent au degré le plus grand.

    De ce faite, ma trame de donnée pour le calcul devient :
    110 0000 0010 0100 1000 0000 0000 0000

    et pour la division euclidienne, j'utilise le polynome défini :
    1011 1000 0101

    Cordialement,

  3. #3
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    J'avoue que je ne comprends pas trop la démarche. Tu sembles travailler avec des mots de 4 bits... Pourquoi un CRC sur 11 bits? Quelque soit la formule que tu emploies, il faut voir le CRC comme le résultat d'un traitement de données avec une propriété particulière qui est que si on le traite à la suite des données déjà traitées, on trouve zéro.

    On émet généralement une trame de mots suivie de son CRC. A la réception, il suffit de calculer un CRC à partir des données reçues y compris le CRC envoyé et ce CRC calculé doit être égal à zéro. Tu as donc là un moyen simple de vérifier ton algo.

    Je t'ai mis ci-dessous un exemple de crc16 qui fonctionne avec des mots de 8 bits.

    A+

    Pfeuh

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
     
    typedef unsigned short int u16;
    typedef unsigned char      u8;
     
    void addToCrc(u8 word, u16* crcptr)
    {
        *crcptr  = (*crcptr >> 8) | (*crcptr << 8);
        *crcptr ^= (u8)word;
        *crcptr ^= (*crcptr & 0xff) >> 4;
        *crcptr ^= (*crcptr << 8) << 4;
        *crcptr ^= ((*crcptr & 0xff) << 4) << 1;
    }
     
    int main(int argc, char** argv)
    {
        u16 crc;
        u16 idx = 0;
        u16 computed_crc;
        u8 data[] = {6, 0, 2, 4, 8, 0, 0, 0};// 110 0000 0010 0100 1000 0000 0000 0000
     
        // verifies that u16 is 2 bytes width
        assert(sizeof crc == 2);
        // initializes crc
        crc = 0x1234; // Any 16 bits value is correct! The received MUST HAVE THE SAME INIT VALUE as the transmitter
        // crc computing
        while(idx < sizeof(data))
        {
            addToCrc(data[idx++], &crc);
        }
        // add computed crc to crc
        computed_crc = crc;
        printf("computed crc = %03x\n", crc);
        addToCrc(computed_crc >> 8, &crc);
        addToCrc(computed_crc & 0xff, &crc);
        printf("crc = %04x\n", crc);
        // MUST BE ZERO!
        assert(crc == 0);
        return 0;
    }

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 140
    Par défaut
    Bonjour,

    Et merci pour votre réponse. En faite, je ne cherche pas à vérifié si le CRC envoyé est égal au CRC reçu.

    Pour essayer d'être claire. J'ai 20 bits de donnée, qui sont codé selon le polynôme que j'ai décrit dans mon dernier message. Je cherche à partir de ça, à calculé la valeur du CRC qui est générer par le biais du polynôme et de la trame de donnée.

    Cordialement,

Discussions similaires

  1. [WD12E] Calcul CRC-CCITT erroné
    Par bouillant dans le forum WinDev
    Réponses: 9
    Dernier message: 17/03/2022, 11h54
  2. Choix et calcul CRC, checksum,md5
    Par mercure07 dans le forum C++
    Réponses: 1
    Dernier message: 22/04/2008, 14h27
  3. Calcul CRC 16
    Par G_angel dans le forum C#
    Réponses: 1
    Dernier message: 16/04/2007, 09h46
  4. Calcul CRC d'une trame
    Par Dimitri_87 dans le forum Réseau
    Réponses: 6
    Dernier message: 10/02/2007, 17h56
  5. Calcul CRC ISO3309
    Par zodd dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/05/2006, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo