Stocker "char Tableau" dans EEPROM Arduino

Bonjour tout le monde,

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.

Je vous remercie

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Comment as-tu déclaré la variable tableau ?

Bonjour midousik

Avec EEPROM.put(0, tableau) pour l'écriture à partir de l'adresse 0 de l'EEPROM
et
EEPROM.get(0, tableau) pour remettre les données dans le tableau.

Cordialement
jpbbricole

1 Like

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.

Bonjour midousik

EEPROM.get(0, tableau);

et
Serial.println(tableau[5]);

Cordialement
jpbbricole

1 Like

Bonjour,

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]

1 Like

Bonjour kamill

C'est l'avantage de EEPROM.put et EEPROM.get, on peut faire abstraction de ça.

L'idéal est de mettre dans une structure, toutes les données à sauver et de les enregistrer et lire en EEPROM avec ces 2 méthodes.

Cordialement
jpbbricole

Ce n'est pas un problème d'écriture ou de lecture dans l'EEPROM, mais un problème de définition d'un tableau en C

Bonsoir;

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;
     }    

Merci infiniment :pray:

Ouais, enfin, si tableau est un tableau de pointeurs, je vois pas l'intérêt de le mettre en EEPROM ... sans sauvegarder ce qui est pointé !

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;
}
1 Like

Merci beaucoup pour votre retour, je testerai le code et je reviens vers vous.

Merci une deuxième fois

C'est pour ça que j'ai posé la question de la nature du tableau (post #3)
Malheureusement, le demandeur a jugé ma question inintéressante. Dommage.

Excusez-moi...je n'ai pas fais attention à votre question...:pray:

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.

Merci pour votre aide

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$ ...

Exactement, des vides entre les $, du coup l'adressage des données dans l'EEPROM changent et les données n'ont plus d'adresse fixe.
cordialement

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.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.