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 :

Question CRC 16


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Question CRC 16
    Bonjour à tous

    Dans le cadre d'un projet, je dois calculer le CRC16 d'une trame que j'envoie et d'une trame que je recoie.

    J'utilise pour cela la fonction suivante:
    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
     
    int Serie::calcul_crc(char* octets, int nboctets){
        int crc=0xFFFF;
        int i, fait=0;
        char afaire;
        if (nboctets!=0){
            do{
                afaire=octets[fait];
                crc^=afaire;
                for(i=0;i<8;i++){
                    if(crc%2!=0)
                        crc=(crc>>1)^0xA001;
                    else
                        crc=crc>>1;
                }
                fait++;
            }while(fait<nboctets);
        }
        return crc;
    }
    J'arrive à calculer le CRC de la trame que j'envoie dans ma fonction send.
    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
     
    bool Serie::Send()
    {
        char trame[]={(char)get_ad(), //adresse esclave
                                   3, //n° fonction
                                   0, //adresse du 1er mot à lire PF
                                   0, //adresse du 1er mot à lire Pf
                                   0, //nb de mot à lire PF
                                   3};//nb de mot à lire Pf
        char tramefinal[8];
        int crc = calcul_crc(trame, sizeof trame/sizeof trame[0]);
        printf("\nCRC16: %X\n", crc);
        printf("Pf: %02X  PF: %02X\n", crc & 0xFF, crc >> 8);
        for(unsigned int i=0; i<sizeof trame; i++)
            tramefinal[i]=trame[i];
        tramefinal[6] = crc & 0xFF;
        tramefinal[7] = crc >> 8;
        cout << uppercase << endl;
        cout << "Trame d'envoie: { ";
        for (unsigned int j=0; j<sizeof tramefinal; j++){
            if(j!=sizeof tramefinal-1)
                cout << hex << (tramefinal[j] & 0xFF)<< dec << " | ";
            else
                cout << hex << (tramefinal[j] & 0xFF)<< dec << " }\n" << endl;
        }
        DWORD chainecaractere = 0;
        WriteFile(hSerial, tramefinal, sizeof tramefinal, &chainecaractere, NULL);
        return true;
    }
    Il est correcte et je l'ai vérifié grâce au site suivant: http://www.lammertbies.nl/comm/info/...lculation.html (CRC 16 MODBUS)

    Le problème est le suivant: que mon esclave me communique sa réponse (une trame de 11 char), je souhaite vérifier le CRC.

    Voici donc ma fonction read:
    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
     
     DWORD dwBytescomReadData=0;
        char trame[11]={'\0'};
        cout<< "En attente de trame..." <<endl;
        ReadFile(this->hSerial, trame, sizeof(trame), &dwBytescomReadData, NULL);
        cout << "dwBytescomReadData: " << dwBytescomReadData << " octets\n" << endl;
        cout << "Trame recu: { ";
        for (unsigned int i=0;i<dwBytescomReadData;i++){
            if (i!=dwBytescomReadData-1)
                cout << hex << (trame[i] & 0xFF) << dec << " | ";
            else
                cout << hex << (trame[i] & 0xFF) << dec <<  " }" << endl;
        }
        cout << nouppercase << endl;
        int crc = calcul_crc(trame, (size trame-2)/sizeof trame[0]);
        printf("\nCRC16: %X\n", crc);
        printf("Pf: %02X  PF: %02X\n", crc & 0xFF, crc >> 8);
    Le CRC que je calcule ne correspond pas à celui envoyer par l'esclave. Sachant que j'obtiens le bon résultat de mon esclave, je pense que le problème vient de mon côté.

    La trame de mon esclave est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    Trame d'envoie: { 5 | 3 | 0 | 0 | 0 | 3 | 4 | 4F }
     
    CRC16: 4F04
    Pf: 04  PF: 4F
     
    Trame recu: { 5 | 3 | 6 | 0 | 0 | 0 | 7 | 0 | D9 | 63 | EE }
     
    CRC16: FFFF119C
    Pf: 9C  PF: FFFFFF11
    Je cherche donc à obtenir EE63 dans le calcul de crc de ma fonction read. Si une âme généreuse connait une solution, je suis preneur !!

    Merci d'avance, Lucas

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 567
    Points : 7 657
    Points
    7 657
    Par défaut
    Bonjour,
    Dans la fonction read, ligne 15, je ne comprends pas bien (size trame-2)/sizeof trame[0], le longueur de la trame crc à contrôler est tout simplement le nombre de caractères reçus sans les 2 derniers donc dwBytescomReadData-2.

Discussions similaires

  1. Cherche l'algo crc 16 bits
    Par icepower dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/08/2002, 13h27
  2. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11
  3. codes crc
    Par patturbo dans le forum C++Builder
    Réponses: 7
    Dernier message: 24/07/2002, 09h28
  4. Question de faisabilité
    Par lisarasu dans le forum CORBA
    Réponses: 3
    Dernier message: 14/05/2002, 11h26
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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