bonjour a tous
Pour mon projet de domotique, je souhaiterais utiliser un tableau de char de taille fixe pour la communication sans fil de 32 octets.
Pour différencier les différents types de module, je voudrais mettre un code dans le 1er octet et que la suite soit différent en fonction du module.
Au depart, je pensais faire une structure pour chaque type de module et faire un CAST de ce que je recevais en fonction du 1er octet. Mais apparement, on ne peut pas faire de CAST avec une structure.
struct st1{
char b;
char a;
}s1;
struct st2{
int c;
}s2;
void setup() {
Serial.begin(9600);
Serial.println("test union");
s1.a=0x12;
s1.b=0x34;
Serial.println((st1)s2.c, HEX);
}
void loop() {
}
Ca ne compile pas et me retourne
Test_CAST_Struct_001.ino: In function 'void setup()':
Test_CAST_Struct_001:16: error: no matching function for call to 'st1::st1(int&)'
Test_CAST_Struct_001.ino:1: note: candidates are: st1::st1()
Test_CAST_Struct_001.ino:1: note: st1::st1(const st1&)
Du coup, j'utilise un UNION en complement avec des #define pour simplifier l'ecriture.
struct st1{
char b;
char a;
};
struct st2{
int c;
};
union un1{
st1 s1;
st2 s2;
};
un1 u;
#define var1 u.s1
#define var2 u.s2
void setup() {
Serial.begin(9600);
Serial.println("test union");
var1.a=0x12;
var1.b=0x34;
Serial.println(var2.c, HEX);
}
void loop() {
}
Il y a bien aussi les pointeurs que je voudrais utiliser pour ne pas avoir les données en double en mémoire, mais je suis un peu largué sur ce point.
Qu'elle est selon vous la meilleur solution?
Avec UNION, ça fonctionne bien pour mon test, mais c'est pour savoir s'il y a mieux ou plus pratique.
Je mettrais toutes les declarations dans un .h que j'inclurais dans les scketchs des différents modules pour avoir la meme chose pour chaque.
Peut etre que j'utiliserais un numéro de version que je testerais pour les futures évolutions afin d'éviter les erreurs. comment peut-on initialiser une valeur directement dans la definition de la structure?
(Edit)Je me reponds à moi même
struct data_struc{
static const byte version=1;
...};
(Edit 2) bein non, ça ne fonctionne pas a cause du static const, ça ne reserve pas de mémoire réellement. 31 octets au lieu de 32 en faisant un sizeof(). Je vais devoir faire une variable et l'initialiser à chaque fois.
PS: en ecrivant ces lignes, je me rend compte que ce n'est pas si mal que ça en faite. ![]()
Merci de m'avoir lu et pour vos suggestions.
a+