Bonjour ... Je ne savais pas quoi mettre dans le titre de mon post ... Mais j'espere que vous comprendrez mon probleme :
Plantage du décors:
J'effectue un programme qui envoie et recoit des trames par le protocole TCP ... Au niveau de cette partie ca fonctionne très bien.
J'ai ensuite voulu rajouter une fonction qui permettais de logger les messages envoyé et recu. Jusque la tout va bien.
Seulement le probleme quand je regarde mon fichier de log, j'obtient la bonne valeur, mais avec plein de F ... Comme l'exemple ci dessous :
FFFFFFE9FFFFFF5E alors que je devrais avoir E95E.
Voici ma fonction pour écrire dans le fichier :
Voici les différentes declaration que j'effectue :
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 void logSend(char tab[], int size){ FILE * logS = NULL; int j; logS = fopen("LogSend.csv", "a"); if(logS != NULL){ for(j=0; j<size; j++){ if(j == 0) fprintf(logS,"%X;",tab[j]); else if(j == 1) fprintf(logS,"%X;",tab[j]); else{ fprintf(logS, "%X%X;", (unsigned short)tab[j+1], (unsigned short)tab[j]); j++; } } } fprintf(logS,"\n"); fclose (logS); }
La declaration de ma structure et la copie dans le buffer:
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 //Structure message a envoyer typedef struct{ char control; char lenght; unsigned short checksum; unsigned short packetID; unsigned short stat1; unsigned short stat2; unsigned short meas1; unsigned short meas2; }statMeasRead; // Buffer message envoi char sendbuf[SIZEBUFFER];
La fonction pour calculer le checksum :
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 // Création d'un pointeur vers la structure. struct statMeasReq *packet; // Allocation de la taille. packet = malloc(sizeof(struct statMeasReq)); // Mise a zéro memset(packet, 0x0, sizeof(struct statMeasReq)); // Garnissage. packet->control = 0x02; packet->lenght = 6; packet->checksum = 0; packet->packetID = packetIDTmp++; packet->checksum = checksum((unsigned short *)packet, packet->lenght); //Copie la structure dans le buffer memcpy((void*)sendbuf, (const void*)packet, packet->lenght);
Voila ... J'espere que vous comprendrez et que vous aurez tout les elements en main pour pouvoir comprendre ...
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 unsigned short checksum(unsigned short *addr, int len){ int nleft = len; unsigned short *w = addr; int sum = 0; unsigned short answer = 0; // Somme des données pris deux par deux. while (nleft > 1) { sum += *w; w++; nleft -= 2; } // Calcule du complément à 1 sur 16bits. answer = ~sum; // Envoie de la valeur du checksum calculé. return (answer); }
Ha ui une chose en plus j'ai rajouté un (unsigned short) pour caster le tableau ... Ca a améliorer un ptit peu le log maintenant j'obtien : FFF9FFE4
... ca fait quelque F en moin ^^ mais pas encore assez :p
Partager