Alors là tu me flingues.....
Ça y est, j'ai compris ! Je suis sensé sortir ma boule de cristal et lui demander :
Montre moi le minimum qui fonctionne pour avoir une base pour démarrer car Labete868 veut que je l'aide mais en devinant ses pensées, ce qui devrait m'amener à ce que son prof lui demande, puis j'arriverai a cerner le mystérieux projet dont ce programme fait partie.
Montre moi si ce que je lis est en partie bon (exemple le prof a donné une base solide) ou alors complètement faux (Labete868 a essayé quelque chose au hasard)
Montre moi pourquoi par exemple, je vois un tableau Trame_Recue[60] d'une taille de 60 caractères alors que la trame dedans ne fait que 48 caractères ? La trame est de taille variable peut être ?
...
...
...
je pourrai continuer comme ça longtemps
Je vais t'aider une dernière fois et si jamais tu réponds à nouveau sans faire l'effort de te mettre à la place des autres, qui ne connaissent pas du tout le contexte de ton projet et en ne donnant strictement aucune explication complémentaire..... je te laisse te débrouiller.
A la fin de ton programme, je parle de celui du tout premier post où tu as donné une image du programme, tu calculs un checksum qui semble être un contrôle de parité, je dis semble être car tu ne nous l'a pas dit clairement. Et cela consiste bien en un XOR (ou exclusif) entre tous les octets de données de la trame. Qu'est ce que des octets de données ?
$N03,22.3, 1012,166,24.5,4837.5196,00225.2343*6E
Ça semble être ce qui est en gras, en gris ce sont des identificateurs/séparateurs qui ne sont pas des données et en rouge c'est le checksum de la trame. C'est à dire quelque chose qui ressemble étrangement a une trame NMEA, je dis semble être car tu ne nous l'a pas dit clairement non plus donc à nous de deviner comment se compose une trame. Donc pour calculer le checksum, il faut bien faire :
'N'^'0'^'3'^','^' '^1........^'4'^'3' = 6E
Donc par le calcul, tu trouves 6E qu'il faut comparer avec le checksum dans la trame (en rouge) $N03,22.3, 1012,166,24.5,4837.5196,00225.2343*6E et si le calcul 6E correspond aux caractères "6E" alors la trame est ok !
Mais ce 6E obtenu par le calcul, il faut le remonter et le sortir de la fonction car tu dois t'en servir dans ton programme, pour comparer :
1 2 3 4 5 6 7 8 9 10 11 12
| char Calcul_Cheksum(char *string)
{
unsigned char i;
unsigned char checksum = 0;
for(i = 1; i < 45; i++)
{
checksum = checksum ^ string[i];
}
return checksum;
} |
Dans ce programme il y a deux choses a comprendre, la première c'est de se demander de où à où on fait le XOR pour calculer le checksum. Je le fais de string[1] qui contient le caractère 'N' jusqu'à string[44] qui contient le caractère '3' ! Attention ! si jamais la trame a une longueur variable, donc qui bouge, alors il faut ajuster la valeur 44 (remarque que dans la boucle for j'ai écrit i strictement inférieur à 45 donc 44) pour ne prendre que les données et la seconde c'est que c'est bien beau de calculer un checksum mais sans la présence de return, une fois la fonction cette valeur est perdue.
A toi de savoir si la trame est fixe ou alors si elle peut bouger ? Moi j'en sais rien.
Donc pour appeler la fonction, on fait comme ça :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
char Trame_OK (char *string)
{
// dans la fonction main on appellera Trame_OK de cette manière Trame_OK (Trame_Recue)
// ce qui sera équivalent a faire Trame_OK ("$N03,22.3, 1012,166,24.5,4837.5196,00225.2343*6E")
// et ça nous aménera dans cette fonction ci dessous
// 1) calcule du checksum de la trame reçue
char checksum = Calcul_Cheksum(string);
// 2) est ce que la variable checksum calculée juste au dessus contient la même valeur de checksum que ce que je lis dans la trame ?
// en prenant garde car je m'apprête à comparer une valeur obtenue par calcul avec des caractères ASCII donc il doit y avoir une histoire
// de conversion ASCII hexa quelque part pour comparer deux choses comparables. il faut aussi se poser la question de la position des
// caractères qui composent le checksum dans la trame. c'est les deux dernières caractères, ok ! mais ils sont aux positions string[?] et string[?]
...
...
...
} |
Est ce que tu comprends jusqu'ici ? Est ce que la trame peut varier en longueur ? C'est à dire est ce que le checksum est toujours composé des caractères 47 et 48 ?
Partager