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:
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 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; }
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)
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; }
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:
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é.
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);
La trame de mon esclave est la suivante:
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 !!
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
Merci d'avance, Lucas
Partager