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