Bonjour,
Afin d'envoyer des valeur via un module sans fil (NRF24L01 ou module LoRa) je dois rassembler et convertir toutes les variables à envoyer dans un tableau de bytes. J'ai trouvé beaucoup de solutions différentes mais aucune suffisamment simple pour mon petit niveau. J'avais imaginé la méthode suivante facilement lisible:
Il me semble que chaque variable est quoi qu'il arrive une suites de bits dont la longueur peut varier en fonction du type de la variable (et du type de processeur) pour un double sur mon arduino mini pro:
Avant envoi:
TabDeBytes[0]=(MonDouble & 0b1111000000000000) >> 12;
TabDeBytes[1]=(MonDouble & 0b0000111100000000) >> 8;
TabDeBytes[2]=(MonDouble & 0b0000000011110000) >> 4;
TabDeBytes[3]=(MonDouble & 0b0000000000001111);
Après réception:
MonDouble=TabDeBytes[0] << 12 | TabDeBytes[1] << 8 | TabDeBytes[2] << 4 | TabDeBytes[3];
Le compilateur n'en veux pas :
error: invalid operands of types 'float' and 'unsigned int' to binary 'operator&'
Je suppose qu'il faut par un moyen lui indiquer qu'on veux utiliser la représentation binaire de la variable?
L'avantage de cette méthode, c'est que comme j'ai certaines variable qui ne seront utilisées qu'en partie, par exemple la mesure de la pression atmosphérique m'est retournée par la librairie en Pa sous forme d'un double. La modification de la pression atmosphérique ne varie que sur une petite plage par rapport à la valeur complète retournée. Dans mon exemple je peux sans problème retirer 87 000 Pa avant envoi et du coup je n'ai plus besoin des 4 octets et peux me contenter de 3. Côté réception j'ai juste à ajouter à nouveau ces 87 000 Pa après avoir recombiné ma variable. Hop j'ai gagné un byte sur mon envoi / temps d’exécution et donc sur la batterie.
-Edit-
En continuant de chercher je me rend compte que les pointeurs sont sûrement une solution?
Avant envoi:
TabDeBytes[0]=valeur retournée par Pointeur positionné sur 1er octet de MonDouble;
TabDeBytes[1]=valeur retournée par Pointeur positionné sur 2eme octet de MonDouble;
TabDeBytes[2]=valeur retournée par Pointeur positionné sur 3eme octet de MonDouble;
TabDeBytes[3]=valeur retournée par Pointeur positionné sur 4eme octet de MonDouble;
Après réception:
valeur par Pointeur positionné sur 1er octet de MonDouble=TabDeBytes[0];
valeur par Pointeur positionné sur 2eme octet de MonDouble=TabDeBytes[1]
valeur par Pointeur positionné sur 3eme octet de MonDouble=TabDeBytes[2]
valeur par Pointeur positionné sur 4eme octet de MonDouble=TabDeBytes[3]
Est-ce la bonne méthode? Est-ce dangereux (je ne contrôle pas la taille de MonDouble je peux écraser d'autres données mémoires?) Comment faire si je passe mon programme d'un atmega 328p à un ESP8266 ou un ESP32, la taille d'un double n'est peut-être pas la même?