Je suis en train de développer une application sur Windev, où j'envoie sur le port série une trame char contenant les données des champs de saisie et que j'ai réussi à la recevoir et la découper puis la mettre dans un tableau sous la forme suivante:
tableau[0] : DDDDDDDDDDDDDDD
tableau[1] : 0755950666
tableau[2] : 0602666222
tableau[3] : 8528888888
tableau[4] : 6266262262
tableau[5] : 5821888888
tableau[6] : 5555
tableau[7] : DEFAUT ROUGE
tableau[8] : DEFAUT VERT
tableau[9] : DEFAUT ROUGE
tableau[10] : DEFAUT VERT
tableau[11] : 20220203
Je viens vers vous pour m'aider à enregistrer ces données dans l'EEPROM de l'Arduino, et les récupérer lorsqu'on aura besoin.
Merci pour votre réponse.
Après la sauvegarde dans l'eeprom , est ce possible de récupérer juste par exemple la variable tableau[5]...sans connaître l'adresse où elle est stockée? Pouvez-vous me donner un bout de programme pour faire ça?
Cordialement.
Le problème est que dans ton exemple tous les éléments n'ont pas la même longueur.
Si tu es capable de connaitre la longueur max d'un élément tu peux déclarer le tableau comme étant un tableau à deux dimensions avec comme deuxième dimension la longueur max: char tableau[12][16]
Ensuite si tu veux charger uniquement l'élément tableau[5] tu connais l'adresse dans l'EEPROM. C'est 0+(char *)tableau[5]-(char *)tableau[0]
Je ne sais plus comment créer une structure à partir de la chaine découpée. si après le morceau de code qui sert à la découpe du message reçu.
char message[tailleMessageMax + 1];
char Mesdonnees[12];
Le morceau du programme de découpe de la chaine de caractères " message" reçue :
int len = strlen(message);
char d[] = "$";
char *p = strtok(message+5, d);
int i = 0;
while(p != NULL)
{
Mesdonnees[i] = p;
p = strtok (NULL, "$");
++i;
}
Il y a un gros problème dans ton programme. Mesdonnees[12] ne doit pas être un char mais un char *, le compilateur devrait donner une erreur ou pour le moins un warning sévère. char * Mesdonnees[12];
Une structure n'a d'intérêt que si tes données sont structurées. De toute façon ça ne résoudra pas ton principal problème qui vient du fait que tu traites des chaines de caractères de longueur variable.
Pour traiter ceci je vois deux méthodes:
la méthode simple qui consiste en un tableau avec la taille des élément dimensionnée au maximum de la taille des textes comme je te l'ai proposé au post #7
ou une méthode plus compliquée qui consiste en un tableau d'adresses suivi des textes. Ca prend en général moins de place en EEPROM, mais la modification d'un élément est plus difficile.
Ca donne un programme de ce genre
#include <EEPROM.h>
const char *msgTest="12345DDDDDDDDDDDDDDD$0755950666$0602666222$8528888888$6266262262$5821888888$5555$DEFAUT ROUGE$DEFAUT VERT$DEFAUT ROUGE$DEFAUT VERT$20220203";
const int tailleMessageMax=150;
char message[tailleMessageMax + 1];
unsigned mesDonnees[12];
void setup()
{
Serial.begin(115200);
// return; // si on ne veut pas réécrire dans l'EEPROM
strcpy(message, msgTest); // pour tester le programme
int len = strlen(message);
const char *d = "$";
char *p = strtok(message + 5, d);
int i = 0;
while (p != NULL)
{
mesDonnees[i] = p-message+sizeof mesDonnees; // adresse du texte dans l'EEPROM
p = strtok (NULL, d);
++i;
}
EEPROM.put(0,mesDonnees); // écrit les adresse des données dans l'EEPROM
EEPROM.put(sizeof mesDonnees, message); // écrit les données dans l'EEPROM
}
void loop()
{
static int i=0;
Serial.print(i);
Serial.print("->");
Serial.println(getData(i));
if (++i>=sizeof mesDonnees/sizeof mesDonnees[0])
while (true); // fin du programme
}
// retourne la donnee lue dans l'EEPROM
char * getData(byte n)
{
static char data[16];
unsigned ad;
EEPROM.get(n*sizeof mesDonnees[0],ad); // adresse du texte dans l'EEPROM
EEPROM.get(ad,data);
return data;
}
Bonjour,
Le code que vous m'aviez proposé marche impeccable.Pourtant , lorsqu'une donnée envoyée n'est plus renseignée (champs de saisie vide) cela veut dire une valeur 0, par conséquent elle n'est plus stockée dans l'EEPROM comme valeur à 0.
Pour information y a que les données en texte qui ont une longueur variable maximale de 30 caractère.
Je ne comprend pas bien ce que tu veux dire.
Tu veux dire que tu peux recevoir des infos vides avec un message de ce genre ?
12345DDDDDDDDDDDDDDD$$0602666222$8528888888$ ...
Apparemment strtok traite les chaines vides comme n'existant pas.
S'il est nécessaire de gérer ces données vides, il faut réécrire l'analyse du message reçu sans utiliser strtok.