c'est louche effectivement les & et |
j'ai pris votre code et je l'ai modifié un peu en m'assurant de bien me remettre au début du répertoire à chaque parcours et de bien fermer tout ce que j'ouvre (chaque open() doit avoir son close() )
j'avais la flemme de brancher des boutons alors j'ai juste utilisé l'entrée série, un + passe au fichier d'après et un - au fichier d'avant (si possible)
j'en ai profité pour virer la classe String que vous utilisez, c'est une mauvaise idée de morceler votre mémoire...
J'ai conservé votre approche avec la librairie SD mais ma recommendation cependant serait de laisser tomber la librairie SD qui est en standard, elle n'est pas la plus à jour et de passer à la librairie SDFat qui est bcp plus robuste.
Je commence par le dernier fichier car il semble c'est ce que vous voulez, donc tapez - pour revenir en arrière
ça donne cela - aucun soucis de stabilité - même après de nombreuses demande, en tapant des trucs comme "-----------++++++-----+++++++------+++-++-+-+-+-+-+-+-+-----+++++-++++++++-------------++-+-++-+--------------++++-+-+-+++++++++" dans la console série (réglée à 115200 bauds)
jetez un oeil
// Programme de test
// Défilement des fichiers de la carte SD
// en partant du dernier
// on se déplace avec l'entrée série en tapant + ou -
#include <SPI.h> // bibliothèque bus SPI
#include <SD.h> // bibliothèque carte SD
const int chipSelect = SS; // SS est défini pour vous, D10 sur UNO, D53 sur MEGA (Slave select)
uint16_t nbFichiers = 0; // nombre de fichiers sur la carte SD
uint16_t noFichier; // le fichier en cours
//-------------------------------------------------
// calcule le nombre de fichiers à la racine
//-------------------------------------------------
uint16_t compteNbFichiers()
{
uint16_t n = 0;
File dossier = SD.open("/");
File fichier;
if (dossier) {
dossier.rewindDirectory(); // on se met au début
while (fichier = dossier.openNextFile()) {
n++; // un de plus
fichier.close(); // on ferme celui là
}
dossier.close();
} else Serial.println(F("Erreur lecture racine"));
return n;
}
//-------------------------------------------------
// affiche un fichier à la racine de la carte SD.
// le nombre total de fichiers doit être correct
//-------------------------------------------------
const char * affiFichier(uint16_t num) {
uint16_t n = 0;
const byte maxFileLength = 20;
static char nomDuFichier[maxFileLength + 1]; // +1 pour le '\0' à la fin, static pour que la mémoire reste allouée car on exporte ce pointeur vers le reste du programme
nomDuFichier[0] = '\0'; // initialisé à vide
File dossier = SD.open("/");
dossier.rewindDirectory(); // on se met au début
File fichier;
if (num <= nbFichiers) {
while (n <= num) {
fichier = dossier.openNextFile(); // on passe au suivant
if (fichier) {
n++; // on se souvient où on est
if (n == num) { // si on a trouvé le bon, on copie son nom
strncpy(nomDuFichier, fichier.name(), maxFileLength);
nomDuFichier[maxFileLength] = '\0'; // par précaution si le nom était trop long
}
fichier.close();
} else break; // erreur de lecture
}
// si en sortie du while on n'a pas rempli le nom de fichier, c'est qu'il y a eu un soucis
if (nomDuFichier[0] == '\0') Serial.println(F("erreur de lecture"));
} else {
Serial.println(F("index incorrect"));
}
dossier.close();
return nomDuFichier;
}
// **********************************************************************
void setup() {
// Debugging output
Serial.begin(115200);
// test carte SD
if (!SD.begin(chipSelect)) {
Serial.println(F("SD absente ou HS. stop."));
while (true); // on meurt ici, pas la peine d'aller plus loin
}
nbFichiers = compteNbFichiers();
Serial.print(nbFichiers); Serial.println(F(" fichiers à la racine"));
Serial.print(nbFichiers); Serial.print(F("\t"));
Serial.println(affiFichier(nbFichiers));
Serial.println(F("\n+ = fichier suivant, - = fichier précédent"));
noFichier = nbFichiers; // n° de fichier dans la liste, on part du dernier
}
void loop() {
const char * nomFichier = NULL;
if (Serial.available()) {
char c = Serial.read();
switch (c) {
case '+':
if (++noFichier > nbFichiers) {
noFichier--;
}
nomFichier = affiFichier(noFichier); // affichage nom fichier indexé par noFichier > 0
Serial.print(noFichier); Serial.print(F("\t"));
Serial.println(nomFichier);
break;
case '-':
if (--noFichier < 1) {
noFichier = 1;
}
Serial.print(noFichier); Serial.print(F("\t"));
nomFichier = affiFichier(noFichier); // affichage nom fichier indexé par noFichier > 0
Serial.println(nomFichier);
break;
}
}
}