[RESOLU]Problème de récupération des données d'un fichier .ini Arduino carte SD

Il faut ajouter une variable qui compte les données que tu as reconnues. La première c’est le nom de la machine, la seconde son adresse IP, etc. Tu incrémentes cette variable après avoir stocké le texte précédent.

Voici une possibilité (pas testé) :

#include <SD.h>

File fichier;

char inputChar;
const int TAILLE = 80;
char tabsd[TAILLE];
int evolutif = 0;
int compte = 0;
char nom_machine = "",adresse_IP="";

void setup() 
{
  Serial.begin(115200);
  if (!SD.begin(4)) {
    Serial.println("Erreur à l'init!");
    return;
  }
  Serial.println("init Ok.");
  fichier = SD.open("config.txt");


}

void loop() 
{
  inputChar = fichier .read();

  if(inputChar != ':' && inputChar != EOF)
  {
    Serial.print("EOF : ");
    Serial.println(inputChar);
    tabsd[evolutif] = inputChar;
    Serial.print("tableau : ");
    Serial.println(tabsd[evolutif]);
  }
  else if(inputChar == ':')
  {
    for(int i = 0; i < evolutif; i++)
    {
      switch (compte) {
      case 1 :
         nom_machine = nom_machine + tabsd[i];
         Serial.print("Resultat : ");
         Serial.println(nom_machine);
         break;
      case 2 :
         adresse_IP = adresse_IP + tabsd[i];
         Serial.print("Resultat : ");
         Serial.println(adresse_IP );
         break
// etc.  <-- à toi de continuer
      default:
         Serial.println("Problème lecture fichier");
         break;
       }
    }
    evolutif = 0;
    compte ++;
  }
    evolutif ++;
    delay(1000);
}

Il faut aussi que tu testes que tu es arrivé à la fin de ton fichier pour passer à autre chose.

Ton programme ne fonctionne pas.
Il continue bien de faire la liste de tous les caractères mais lors de l’ajout de l’information totale et de l’affichage, il bug, je ne sais pas d’où cela peut venir puisque pourtant ça à l’air juste.

L’image du moniteur en pièce jointe.

pb4.PNG

Peux-tu me donner le contenu du fichier que tu lis?
Tu peux ajouter après les case : Serial.println(tabsd*); pour qu'on voie ce qu'il lit.*

Voila le fichier.

config.txt (31 Bytes)

Essaye ça :

#include <SD.h>

File fichier;

char inputChar;
const int TAILLE = 80;
char tabsd[TAILLE];
int evolutif = 0;
int compte = 0;
String nom_machine = "", adresse_IP = "";
String nom_user = "", pass = "";

void setup()
{
  Serial.begin(115200);
  if (!SD.begin(4)) {
    Serial.println("Erreur à l'init!");
    return;
  }
  Serial.println("init Ok.");
  fichier = SD.open("config.txt");
}

void loop()
{
  inputChar = fichier.read();
  if (inputChar != ':' && inputChar != EOF)
  {
    tabsd[evolutif] = inputChar;
    Serial.print(evolutif);
    Serial.print("tableau : ");
    Serial.println(tabsd[evolutif]);
  }
  else if (inputChar == ':')
  {
    for (int i = 0; i < evolutif; i++)
    {
      switch (compte) {
        case 1 :
          nom_machine = nom_machine + tabsd[i];
          Serial.print("Resultat : ");
          Serial.println(nom_machine);
          break;
        case 2 :
          adresse_IP = adresse_IP + tabsd[i];
          Serial.print("Resultat : ");
          Serial.println(adresse_IP );
          break;
        case 3 :
          nom_user = nom_user + tabsd[i];
          Serial.print("Resultat : ");
          Serial.println(nom_user);
          break;
        case 4 :
          pass = pass + tabsd[i];
          Serial.print("Resultat : ");
          Serial.println(pass );
          break;
        default:
          Serial.print("Problème lecture fichier - compte = ");
          Serial.println(compte);
          break;
      }
    }
    evolutif = 0;
    compte ++;
  }
  else if (inputChar == EOF)
  {
    Serial.println("FINI !");
    while (1) {}
  }
  evolutif ++;
  delay(1000);
}

J’ai changé les char en String, on verra ce que ça donne.

Voila le résultat.
J’ai l’impression qu’on s’en sortira jamais …

[EDIT]
J’ai trouvé une partie du problème, le premier cas du switch doit partir de 0 et ainsi de suite.

Voila l’affichage dans le moniteur suite à cette modification (pb6).

Et changer     evolutif = 0;en    evolutif = -1;

Avec évolutif = 1; le résultat est dans pb8;

Je me suis permis de modifier quelques trucs et si on laisse évolutif à 0, j’arrive à un truc qui est pas trop mal(pb7), il manque juste le password et un “3” s’est ajouté derrière TOTO.

#include <SD.h>

File fichier;

char inputChar;
const int TAILLE = 80;
char tabsd[TAILLE];
int evolutif = 0;
int compte = 0;
String nom_machine = "", adresse_IP = "";
String nom_user = "", pass = "";

void setup()
{
  Serial.begin(115200);
  if (!SD.begin(4)) {
    Serial.println("Erreur à l'init!");
    return;
  }
  Serial.println("init Ok.");
  fichier = SD.open("config.txt");
}

void loop()
{
  inputChar = fichier.read();
  if (inputChar != ':' && inputChar != EOF)
  {
    tabsd[evolutif] = inputChar;
    Serial.print(evolutif);
    Serial.print("tableau : ");
    Serial.println(tabsd[evolutif]);
  }
  else if (inputChar == ':')
  {
    for (int i = 0; i < evolutif; i++)
    {
      switch (compte) {
        case 0 :
          nom_machine = nom_machine + tabsd[i];
          Serial.print("Resultat : ");
          Serial.println(nom_machine);
          break;
        case 1 :
          adresse_IP = adresse_IP + tabsd[i+1];
          Serial.print("Resultat : ");
          Serial.println(adresse_IP);
          break;
        case 2 :
          nom_user = nom_user + tabsd[i+1];
          Serial.print("Resultat : ");
          Serial.println(nom_user);
          break;
        case 3 :
          pass = pass + tabsd[i+1];
          Serial.print("Resultat : ");
          Serial.println(pass);
          break;
        default:
          Serial.print("Problème lecture fichier - compte = ");
          Serial.println(compte);
          break;
      }
    }
    evolutif = 0;
    compte ++;
  }
  else if (inputChar == EOF)
  {
    Serial.println("FINI !");
    Serial.println(nom_machine);
    Serial.println(adresse_IP);
    Serial.println(nom_user);
    Serial.println(pass);
    while (1) {}
  }
  evolutif ++;
  delay(1000);
}

On a déjà fait un grand pas.

C'est 'moins 1', pas '1' (tu as oublié les photos)

Il faut aussi connaitre le caractère à la fin (les dernières lignes de ta photo). Peux-tu changer ici :

  Serial.println(tabsd[evolutif]);

en

  Serial.print(tabsd[evolutif]);
    Serial.print(" Code ASCII : ");
    Serial.print(tabsd[evolutif],DEC);

et me renvoyer la copie de la console ? Ça va aider à régler le problème du password.

Autant pour moi, j’ai donc remplacé par -1 et j’ai affiché le code ASCII.
Voila le résultat.

Bon, le -1 n'était pas une bonne idée...
Le dernier caractère, après la fin du password est le numéro 13, soit 'CR'. Il faut donc tester avec CR ou 13 au lieu de EOF

  if (inputChar != ':' && inputChar != CR)
...
  else if (inputChar == ':' || inputChar == CR)

Ça donne quoi ?

Le problème c'est qu'il me dit que CR n'est pas défini, donc comment le définir ?

Essaye de mettre 13 à la place de CR
Sinon
#define CR 13au début du programme

Maintenant le programme tourne à n'en plus finir.
J'ai remplacé le CR par 13.

Mais il affiche des choses ou pas ?
Tu as remis 0 à la place de -1 ?

Voila. Actuellement il en est à 700.

[EDIT] J’ai remis 0, les résultats en pb 11.
Il y a un A qui s’incruste dans les variables et le programme tourne infiniment.

Voilà je t’ai mis un code qui te fait tout je t’ai mis le screen de se que tu récupères dans les variables :slight_smile:

#include <TextFinder.h>
#include <SPI.h>
#include <SD.h>

typedef struct
{
  String nom;
  String ip;
  String id;
  String pwd;
}machine;

File conf;

void setup() {
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  digitalWrite(10,HIGH);
  int temp;
  char buff[50];
  machine m1;
  if (!SD.begin(4)) { // Gère les erreurs
    //Serial.println("Erreur de carte SD !");
    for(;;);
    }
    
    conf=SD.open("configpb.txt", FILE_READ);
    TextFinder finder(conf);
    conf.seek(0);
    temp=finder.getString("[NOM]",";",buff,50);
    m1.nom=buff;
    Serial.println(m1.nom);
    temp=finder.getString("[IP]",";",buff,50);
    m1.ip=buff;
    Serial.println(m1.ip);
    temp=finder.getString("[Identifiant]",";",buff,50);
    m1.id=buff;
    Serial.println(m1.id);
    temp=finder.getString("[PWD]",";",buff,50);
    m1.pwd=buff;
    Serial.println(m1.pwd);
}

void loop() {
  // put your main code here, to run repeatedly:

}

PS: J’ai un peu changer le format de la conf mais je trouve quand même ça plus lisible

[NOM]A01;
[IP]10.138.0.1;
[Identifiant]TOTO;
[PWD]TOTOTTE;

sketch_jun07a.ino (930 Bytes)

configpb.txt (65 Bytes)

Super, ton code marche à la perfection.
Seulement, comment je fais pour me servir de ce que j'ai récupéré dans le loop ?
j'ai essayé et cela de fonctionne pas. De plus peux-tu m'expliquer le fonctionnement pour que je le comprennes et puisse l'adapter si jamais j'ai a nouveau besoin de refaire quelque chose dans ce genre.
Merci.

C'est vrai que c'est bien plus simple comme ça !! :slight_smile:

Herouis:
Super, ton code marche à la perfection.
Seulement, comment je fais pour me servir de ce que j'ai récupéré dans le loop ?
j'ai essayé et cela de fonctionne pas. De plus peux-tu m'expliquer le fonctionnement pour que je le comprennes et puisse l'adapter si jamais j'ai a nouveau besoin de refaire quelque chose dans ce genre.
Merci.

Tu vois la déclaration de la machine m1 ? Si oui il te suffit de sortir la déclaration du Setup() et de la mettre en variable globale et tu pourras l'utiliser dans le loop :wink:

temp=finder.getString("[NOM]",";",buff,50);

cette fonction lit entre les caractères que tu lui à passer en paramètres cet à dire entre "[NOM]" et ";" dans cette exemple. Ensuite tu lui donne un tableau de caractères(Buff) dans lequel il pourra ranger la chaine de caractères et ensuite la taille max du tableau Buff.
PS:la fonction renvoi un entier que l'on range dans temp tu peux l'utiliser pour voir si tu as une erreur sur la lecture, si tu veux l'utiliser il te faut regarder dans la doc les valeurs renvoyé.

m1.nom=buff;

ici tu ne fais que ranger se que tu as obtenu dans m1.nom

et je pense que tu maitrise le serial print :wink:

lesept:
C'est vrai que c'est bien plus simple comme ça !! :slight_smile:

Bah oui les librairies sont la pour nous :smiley: