
Envoyé par
Nemesis007
J'ai une température que je génère aléatoirement et que je dois renvoyer dans une trame. Dans cette trame, toutes les données sont des paquets de 2 octets, par exemple : "0403020320CRC".
Stop !
Ces guillemets ont-ils un sens ? C'est à dire, les données sont-elles codées sous la forme d'une chaine de caractères représentant des valeurs en hexadécimal, ou s'agit-il de données binaires que tu as représenté ici de façon hexadécimal, pour qu'on puisse les lire ?
Autrement dit, tu émets un message de 6 octets
1 2 3 4 5 6 7
|
[0] 04
[1] 03
[2] 02
[3] 03
[4] 20
[5] CRC |
ou de 12 octets ?
(ASCII)
1 2 3 4 5 6 7 8 9 10 11 12 13
|
[0] 30 '0'
[1] 34 '4'
[2] 30 '0'
[3] 33 '3'
[4] 30 '0'
[5] 32 '2'
[6] 30 '0'
[7] 33 '3'
[8] 32 '2'
[9] 30 '0'
[10] 3? CRC High
[11] 3? CRC Low |
Ce qui est en gras dépend de la température, c'est à dire que si j'ai 800° (0320 en hexadécimal), je dois convertir cette valeur en hexadécimal puis la concaténer à la chaine déjà existante, qui ne change pas et qui est : "040302". Après avoir copié ces caractères dans la chaine, j'appelle une fonction qui me permet de "créer" le CRC correspond à cette chaine de caractère
Donc, si j'ai bien compris, le transport des données se fait sous une forme textuelle représentant la traduction en hexadécimale de 6 octets. C'est bien ça ? (donc le 2ème format : textuel)
Etant donné qu'il y a un calcul de CRC en jeu, et que celui-ci doit se faire sur des valeurs binaires, je suggère de travailler 'en interne' avec un tableau de 6 unsigned char dans lequel tu places les données ainsi :
1 2 3 4 5 6 7
|
[0] 04
[1] 03
[2] 02
[3] Temperature (MSB)
[4] Temperature (LSB)
[5] CRC (0 par défaut) |
Avant l'acquisition de la température, tu prépares le tableau avec les valeurs qui vont bien dans [0], [1] et [2] (des valeurs fixes, si j'ai bien compris) :
unsigned char tab[6] = {4, 3, 2};
au moment de l'acquisition :
unsigned temp = get_temp();
tu places le MSB en [3] et le LSB en [4]
1 2 3
|
tab[3] = (temp >> (8 * 1)) & 0xFF;
tab[4] = (temp >> (8 * 0)) & 0xFF; |
ensuite, tu calcules le CRC sur les octets [0] à [4], et tu places le résultat en [5].
Ce n'est que là, avant de transmettre le résultat, que tu convertis le tableau de données en représentation texuelle hexadécimal de la façon suivante (brute force) :
1 2 3 4 5 6 7 8 9 10 11
|
char buf_ems[sizeof "xxxxxxxxxxxx"];
sprintf ("%02X%02X%02X%02X%02X%02X",
tab[0],
tab[1],
tab[2],
tab[3],
tab[4],
tab[5]
); |
buf est maintenant une chaine hexadécimale bien formée représentant les valeurs de 6 octets.
Elle peut être transmise au dispositif d'émission.
Partager