Problema con modulo microSD (Lista de Archivos) [Solucionado]

Buenas tardes, he estado intentando hacer un programa que me permita acceder a la lista de archivos TXT guardados en una SD, para despues seleccionar alguno y leerlo por el puerto serie.
El archivo se lee bien, no hay ningún problema hasta ahí. Pero al querer leer la lista de archivos nuevamente, solo me devuelve el nombre de los archivos posteriores al que acabo de leer, ya no me da la lista completa. Solo hasta que vuelvo a resetear el arduino por botón. Utilizo las librerías SD.h y SPI.h

Este es el codigo que estoy utilizando para abrir el directorio y leer archivos.

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

String cadenaEnt = "";
String nombre = "";
String nombreArchivo = "";

int SDon = 2;
int SDselect = 10;

char caracterEnt;

File raiz;
File archivo;

void setup (){
  pinMode(SDon, OUTPUT);
Serial.begin(9600);
if (!SD.begin(SDselect)){ 
    digitalWrite(SDon, LOW);
    return;              
    } 
digitalWrite(SDon, HIGH);}

void loop (){
  
  if (Serial.available()){
    
 caracterEnt = Serial.read();
 cadenaEnt +=  caracterEnt;
 
    if (caracterEnt =='l') {
       raiz = SD.open("/");
     imprime_directorio(raiz);
      Serial.print("o");
    raiz.close();  
   cadenaEnt = "";
   nombre="";
   }
    if (caracterEnt == 'n'){
     lee_archivo ();

     }}}

//--------------------------------------------     
void imprime_directorio (File directorio){
while(true) {     
     File entrada =  directorio.openNextFile();    
    if (! entrada) {
     break; }
     Serial.print(entrada.name());
     entrada.close();
     Serial.print(","); }}
//------------------------------------------     
void lee_archivo (){
nombre= cadenaEnt;
nombre.replace("n","");
nombreArchivo = nombre + ".txt";
File fichero = SD.open(nombreArchivo);
if (fichero){
  Serial.println("w");
  while (fichero.available()){
    Serial.write(fichero.read());}
    fichero.close();
    cadenaEnt = "";
    nombre = "";  }}

//--------------------------------------------

Le he dado muchas vueltas a esto y ya llevo días intentando arreglarlo, incluso estoy considerando en resetear el arduino con ayuda de un transistor conectado a un pin cuando termine de leer un archivo (realmente no quiero llegar esto), si alguno de ustedes puede ayudarme o pudiese aconsejarme, se lo agradecería mucho.

Supongo que los nombres son todos en mayúsculas; una 'l' o 'n' que pongas en medio y vendrán los problemas...

en realidad ese no es el problema, los archivos los lee perfectamente guarda y almacena bien, cuando llega el String con el nombre y la "n", lo separa para tener el nombre limpio y le añade la extension .txt. los nombre son numeros ejemp:
09222017.txt
y ya teniendo la lista por primera vez y conociendo el nombre de los archivos puedo abrirlos una y otra vez sin inconvenientes.
Pero la aplicación para la que lo necesito, requiere que el equipo este prendido por muchos dias, meses incluso. y si alguien quiere venir otro dia y leer los nuevos archivos almacenados, pues ya no vuelve a dar la lista completa.

Tendría que probarlo yo mismo para ver si encuentro la causa.

Echando de ver el código, tu problema no debería pasar ya que cierras el objeto que apunta al directorio raíz; y eso (creo yo) debería devolverlo a la primera entrada (archivo) al momento de reabrir.

AlmaEstradaVaz:
Pero al querer leer la lista de archivos nuevamente, solo me devuelve el nombre de los archivos posteriores al que acabo de leer, ya no me da la lista completa. Solo hasta que vuelvo a resetear el arduino por botón.

Ahora que lo pienso... ¿que tal si la variable raiz fuera local y no global? Pareciera como que el objeto no muere, sino que se reutiliza al momento de reabrir. Y si el objeto no muere, aún conserva el índice del último archivo ingresado.

No estoy seguro, solo es una hipótesis... ::slight_smile:

Muchas gracias por su ayuda, ya he solucionado el problema, utilice la funcion .seek() que me lleva en una posición especifica del fichero, así antes de leer el directorio utilizo:
raiz.seek(0);
para que me ubique al principio del mismo y no se salte ningún archivo.

AlmaEstradaVaz:
ya he solucionado el problema, utilice la funcion .seek() que me lleva en una posición especifica del fichero, así antes de leer el directorio utilizo:
raiz.seek(0);
para que me ubique al principio del mismo y no se salte ningún archivo.

No era la solución que tenía en mente, pero al menos ya me diste una pista de cómo funciona el sistema de archivos FAT32.

Lo que en un sistema de archivos se conoce como "directorio" (carpeta para las interfaces gráficas), en FAT32 se implementa como un "archivo especial" (literalmente lo es, solo que en la tabla de asignación de archivos o "FAT" por las siglas en inglés, lo marcan como directorio). De hecho, subdirectorios de la raíz también se ubican físicamente en la sección de memoria destinada a almacenar el contenido de los archivos como tal.

El contenido de un "archivo directorio" es un conjunto de índices o punteros de la FAT que apuntan (valga la redundancia) a la información de los archivos que contiene ese directorio. Como el sistema de archivos lleva el número 32 en el nombre, sospecho que dichos punteros son de 32 bits (4 bytes). Por eso cuando haces seek(0); le dices al "puntero del archivo" que regrese al primer índice del contenido del directorio.

Una solución muy extraña, pero funciona y esa fue mi explicación del porqué...