Bonjour,
J'avance un peu mais je me heurte à une boucle infini. En partant du sujet skyduino j'ai fait mon code comme suit:
#define SIZE_BUFFER 32 //Nombre de case du buffer
char bufferConf[SIZE_BUFFER]; //Le buffer des fichiers de conf
String tblConfSvg[clef][valeur]; //Tableau de configuration Sauvegarde
String tblConfMdle[clef][valeur]; //Tableau de configuration valeur
/* SETUP */
void setup() {
//Initialiser la carte SD
if(initSD()) {
//Lister les fichier de sauvegardes
listeFichier("/svgde/");
//Lister les fichiers de configuration modèle
nbFichierMdle = listeFichier("/modeles/");
//Ouvrir le fichier de sauvegarde memo.txt
ouvrirFichier("/svgde/", tblFicSvg[0]);
}
else {
//Charger les valeurs par défaut de la radio
}
}
/* LOOP */
void loop() {
}
/* FONCTION initSD() */
boolean initSD() {
clearLcd(); //Effacer l'écran
ecrireLcd("Init SD Card...", 01); //Ecrire
//Si la carte n'est pas présente ou qu'elle est en défaut
if(!SD.begin(4)) {
//Afficher l'écran LCD
clearLcd(); //Effacer l'écran
ecrireLcd("Init SD Card failed", 01); //Ecrire
delay(1000);
return false;
}
clearLcd(); //Effacer l'écran
ecrireLcd("Init SD Card done", 01); //Ecrire
delay(1000);
return true;
}
/* FONCTION listerFichier() */
int listeFichier(String chemin) {
int count = 0;
char path[SIZE_BUFFER];
//Conversion du chemin
chemin.toCharArray(path, SIZE_BUFFER);
//Ouvre ce qui est défini par le chemin
myFile = SD.open(path);
//Tant que c'est vrai
while(true) {
//Prend le nom du fichier
File entry = myFile.openNextFile();
//Si c'est la fin
if(!entry) {
break; //Sortir de la boucle
}
//Si le nombre de fichier est plus important que le nombre de place en tableau
if(count == nbFic) {
break; //Sortir de la boucle
}
//Si c'est le répertoire /modeles/
if(chemin == "/modeles/") {
//Rentre le nom de fichier dans le tableau des noms de modèles
tblFicMdle[count] = entry.name();
}
//Si c'est le répertoire /sauvegarde/
if(chemin == "/svgde/") {
//Rentre le nom de fichier dans le tableau des noms de sauvegarde
tblFicSvg[count] = entry.name();
}
count++; //Compter le nombre de fichier
}
//Fermer le fichier
myFile.close();
//Retourner le nombre de fichier
return count;
}
/* FONCTION qui ouvre un fichier */
void ouvrirFichier(String chemin, String fic) {
/*
String tblConfSvg[clef][valeur]; //Tableau de configuration Sauvegarde
String tblConfMdle[clef][valeur]; //Tableau de configuration valeur
*/
//Variables
char path[SIZE_BUFFER], *key, *val;
int i, bufferLenght;
//Re crée le chemin
chemin = chemin + fic;
//Transforme le chemin en tableau de carractères
chemin.toCharArray(path, SIZE_BUFFER);
//Ouvre le fichier de configuration
myFile = SD.open(path, FILE_READ);
//Erreur d'ouverture du fichier
if(!myFile) {
clearLcd(); //Effacer l'écran
ecrireLcd("Fichier failed", 01); //Ecrire
for(;;); //Boucle infini (peut tre remplacer par un bouton valider)
}
//Tant que ce n'est pas la fin du fichier
while(myFile.available()) {
//Récupère la ligne
i=0;
while((bufferConf[i++] = myFile.read()) != '\n') {
//Si la ligne dépasse le buffer
if(i == SIZE_BUFFER) {
//Finir la ligne et stopper la lecture
while(myFile.read() != '\n') {
break;
}
}
}
bufferLenght = i; //Garder en mémoire le nombre de char
bufferConf[--i] = '\0'; //Finalise la chaine en virant le \n
//Ignore les lignes vides, les commentaires # et //
if(bufferConf[0] == '\0' || bufferConf[0] == '#' || bufferConf[0] == '//') {
continue;
}
//Cherche l'emplacement de la clef en ignorant les espaces et tabulations
i = 0;
while(bufferConf[i] = ' ' || bufferConf[i] == '\t') {
//Ignore les lignes contenant uniquement des espaces ou des tabulations
if(++i == bufferLenght) {
break;
}
key = &bufferConf[i];
/*
Ici boucle inini ?
*/
//Cherche l'emplacement du séparateur
while(bufferConf[i] != '=') {
//Ignore les espaces et tabulations
if(bufferConf[i] == ' ' || bufferConf[i] == '\t') {
bufferConf[i] = '\0';
}
//Ignore les lignes mal formés
if(++i == bufferLenght) {
break;
}
}
/*
//Gère les lignes mal formés
if(i == bufferLenght) {
continue;
}
bufferConf[i++] = '\0'; //Transforme me séparateur = en \o et continue
//Cherche l'emplacement de la valeur en ignorant espaces et tabulations
while(bufferConf[i] == ' ' || bufferConf[i] == '\t') {
//Ignore les lignes contenant uniquement des espaces ou des tabulations
if(++i == bufferLenght) {
break;
}
//Gère les lignes mal formés
if(i == bufferLenght) {
continue;
}
val = &bufferConf[i];
//Charger la clef et la valeur dans le tableau à deux dimension
Serial.println(key);
Serial.println(val);
}
*/
Serial.println(key);
}
/*
//Si c'est le répertoire /sauvegarde/
if(chemin == "/svgde/") {
}
//Si c'est le répertoire /modeles/
if(chemin == "/modeles/") {
}
*/
//Serial.write(myFile.read());
}
Serial.println("Fin fichier");
//Fermer le fichier
myFile.close();
delay(1000);
}
A un endroit, je pose la question de la boucle infini. Un test m'a prouvé que l'on ne s'arrêtais pas sur le '=' et que 1 s'incrémentais sauvagement ! Si je vire le while en le mettant en commentaire, je vais bien jusqu'à la fin de fichier. Donc la condition n'arrive jamais. Je cherche pourquoi.
Pour rappel, mon fichier ne contient qu'une ligne étnant : Modele = modele001.
Merci.