elenco dei file su sdcard che sparisce

Prima cosa un saluto a tutti. Da un po' di tempo uso Arduino e grazie all'ottima documentazione e topic esistenti sul forum ho risolto tutti i problemi che sorgevano. Ora però non so che fare.

Ho caricato l'esempio "listfiles" della libreria SD per leggere i file presenti sulla scheda SD e funziona infatti vedo l'elenco dei file (2 file). Poi ho modificato tale esempio per fare un refresh ogni secondo. Il tutto funziona e mi fa vedere l'elenco dei file per 8 volte ma dalla nona in poi non mi da alcun risultato. Ho provato col comando "rewindDirectory()" ma niente da fare.

Qualcuno ha idea del perchè di questa cosa?

Grazie tante

ilpaso

prova a postare lo sketch molto probabilmente mandi in saturazione la memoria di arduino e quindi il codice non viene eseguito più

Ecco il codice:
(uso l’ethernet shield)

/*
  SD card basic file example
 
 This example shows how to create and destroy an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created   Nov 2010
 by David A. Mellis
 updated 2 Dec 2010
 by Tom Igoe
 
 This example code is in the public domain.
 	 
 */
#include <SD.h>

File root;

void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(10, OUTPUT);

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  root = SD.open("/");
}

void loop()
{
  printDirectory(root, 0);
  Serial.println("done!");
  root.rewindDirectory();
  delay(1000);
}

void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       //Serial.println("**nomorefiles**");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
   }
}

Grazie

from http://arduino.cc/forum/index.php/topic,91560.0.html

5 ) per aiutare chi vi vuole aiutare descrivere:
a ) l’hardware utilizzato nel dettaglio: il tipo di Arduino, i componenti usati
b ) il sistema operativo usato: spesso le cose cambiano da SO a SO, inoltre già si può ricevere aiuto da chi ha lo stesso SO
c ) nel caso di un programma che non funziona, includere sempre lo sketch con i tag specifici (l’icona “#”)
d ) nel caso di collegamenti elettrici, riportare sempre lo schema preferibilmente disegnato con Eagle o Kicad, evitare schizzi a mano o Fritzing (va bene per i blog, non va bene per chiedere aiuto)
e ) descrivere bene cos’è che non va e cosa dovrebbe invece accadere. Dire “la seriale non funziona” non significa nulla, bisogna dire cosa si sta facenda con la seriale (spedire un carattere, aspettare un input), cosa succede e cosa invece dovrebbe succedere

Stai usando uno shield SD, una ethernet con SD, IDE 1.0.1 ?

ciao

Innanzitutto buongiorno a tutti e grazie dell’ eventuale aiuto che mi vorrete fornire :),

sono decisamente nuovo del forum e ho cercato di seguire le regole indicate in http://arduino.cc/forum/index.php/topic,149014.0.html, quindi credo che sia meglio aggiungere il mio problema qui visto che e’ uguale a quello descritto in questo topic.
In pratica, dopo il 3’ ciclo di esecuzione del programma l’elenco dei files visualizzato si accorcia man mano fino ad azzerarsi.
Ho installato prorpio ieri la versione 1.04 e sto lavorando con un Arduino1 rev 3 e una SD shield (http://www.futurashop.it/allegato/8190-SDCARDSHIELD.asp?L2=SHIELD%20E%20ACCESSORI%20ARDUINO&L1=SOFTWARE%20E%20SISTEMI%20DI%20SVILUPPO&L3=&cd=8190-SDCARDSHIELD&nVt=&d=12,00)
presa in un negozio qui vicino, il tutto gira su windows XP.
Il programma, preso dall’ esempio indicato nelle librerie SD per openNextFile(), e’ il seguente :


#include <SD.h>
#include <avr/pgmspace.h>
#include "Tlc5940.h"
#include "showarray.h"

File root;

void setup() {
  // You can optionally pass an initial PWM value (0 - 4095) for all channels.
  Tlc.init();
  // Open serial communications for DEBUG
  Serial.begin(9600);
  
  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(10, OUTPUT);

  // utilizzo il pin 8 x evitare problemi in quanto il pin 10 e' usato dal TLC5940. 
  // Sulla mia SD shield CS e' selezionabile tramite jumper 
  if (!SD.begin(8)) {
    // inserire segnalazione errore n. 1
    Serial.println("initialization failed!");
    return;
  }
  Serial.println(" done.");

  root = SD.open("/");  
}

void printDirectory(File dir, int numTabs) {
  while(true) {
    File entry =  dir.openNextFile();
    if (! entry) {
      // no more files
      Serial.println("**nomorefiles**");
      //mancava azzeramento contatore files nell'esempio, preso da versione 1.04,
      //necessario visto che printDirectory viene eseguito + volte
      [color=red]dir.rewindDirectory();[/color]
      break;
    }
    for (uint8_t i=0; i<numTabs; i++) {
      Serial.print('\t');
    }
    Serial.print(entry.name());
    if (entry.isDirectory()) {
      Serial.println("/");
      printDirectory(entry, numTabs+1);
    } else {
      // files have sizes, directories do not
      Serial.print("\t\t");
      Serial.println(entry.size(), DEC);
    }
  }
}

void loop() {
  unsigned int numframe;
  unsigned int channel;
  unsigned int temp;
  
  [color=red]printDirectory(root, 0)[/color];
  
  for ( numframe = 0; numframe < SHOW_FRAMES; numframe++ ) {
    #ifdef DEBUG 
    Serial.println( );
    Serial.print( numframe );
    Serial.print( "-" );
    #endif
    for ( channel = 0; channel < 16; channel++ ) {
      temp = pgm_read_byte_near( showarray + numframe * 16 + channel );
      Tlc.set ( channel, 16 * temp );
      #ifdef DEBUG      
      Serial.print( temp );
      #endif
    }
    Tlc.update();
    int ritardo = analogRead(0);
    delay(ritardo);
  }
}

L’output del programma su seriale e’ il seguente :


Initializing SD card... done.
EFFETTI/
	CINQUE.005		20164
	EFFETDUE.001		6762
	EFFETUNO.001		4085
	QUATTRO.003		20164
	TRE.002		8408
EFFETTI/
	CINQUE.005		20164
	EFFETDUE.001		6762
	EFFETUNO.001		4085
	QUATTRO.003		20164
	TRE.002		8408
EFFETTI/
	CINQUE.005		20164
	EFFETDUE.001		6762
	EFFETUNO.001		4085
	QUATTRO.003		20164
	TRE.002		8408
EFFETTI/
	CINQUE.005		20164
EFFETTI/
EFFETTI/
EFFETTI/

Spero che non si tratti di interferenze con le librerie “TLC5940” perche’ non saprei proprio come fare senza di esse, ma visto che succedeva anche all’ utente di questo post che non le usava, direi proprio di no.
In attesa di una vostra risposta, cordialmente, Andrea Molteni

a me sembra che nell’esempio ci sia

#include <SPI.h>
entry.close();

dove sono finite?

stessa cosa nel post di ilpaso

Ciao Pablos e grazie x la risposta,

ho guardato nell’ esempio (http://arduino.cc/en/Reference/FileOpenNextFile) e quelle due righe non le vedo… Comunque, ho provato lo stesso ad aggiungerle nel codice dove + mi sembrava logico e la cosa non e’ cambiata.
Ho riscritto il codice comprendendo solo l’esempio e le librerie x Tlc :

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

File root;

void setup() {
  // You can optionally pass an initial PWM value (0 - 4095) for all channels.
  Tlc.init();
  // Open serial communications for DEBUG
  Serial.begin(9600);
  
  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(10, OUTPUT);

  // utilizzo il pin 8 x evitare problemi in quanto il pin 10 e' usato dal TLC5940. 
  // Sulla mia SD shield CS e' selezionabile tramite jumper 
  if (!SD.begin(8)) {
    // inserire segnalazione errore n. 1
    Serial.println("initialization failed!");
    return;
  }
  Serial.println(" done.");

  root = SD.open("/");  
}

void printDirectory(File dir, int numTabs) {
  while(true) {
    File entry =  dir.openNextFile();
    if (! entry) {
      // no more files
      Serial.println("**nomorefiles**");
      //mancava azzeramento contatore files nell'esempio, preso da versione 1.04,
      //necessario visto che printDirectory viene eseguito + volte
      dir.rewindDirectory();
      entry.close();
      break;
    }
    for (uint8_t i=0; i<numTabs; i++) {
      Serial.print('\t');
    }
    Serial.print(entry.name());
    if (entry.isDirectory()) {
      Serial.println("/");
      printDirectory(entry, numTabs+1);
    } else {
      // files have sizes, directories do not
      Serial.print("\t\t");
      Serial.println(entry.size(), DEC);
    }
  }
}

void loop() {
 
  printDirectory(root, 0);
  delay(1000);
 
}

E questo e’ l’output sulla seriale :

Initializing SD card... done.
EFFETTI/
	CINQUE.005		20164
	EFFETDUE.001		6762
	EFFETUNO.001		4085
	QUATTRO.003		20164
	TRE.002		8408
	TEST/
**nomorefiles**
**nomorefiles**
**nomorefiles**
EFFETTI/
	CINQUE.005		20164
	EFFETDUE.001		6762
	EFFETUNO.001		4085
	QUATTRO.003		20164
	TRE.002		8408
	TEST/
**nomorefiles**
**nomorefiles**
**nomorefiles**
EFFETTI/
	CINQUE.005		20164
	EFFETDUE.001		6762
	EFFETUNO.001		4085
	QUATTRO.003		20164
	TRE.002		8408
**nomorefiles**
**nomorefiles**
EFFETTI/
**nomorefiles**
**nomorefiles**
EFFETTI/
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**

Come vedi, non e’ cambiato un gran che… Anzi, gia’ dal 3’ giro e’ sparita la sottodirectory “test”.
Cordialmente, Andres

edit by mod: per favore includi il codice usando gli appositi tag. Grazie…

Initializing SD card... done.
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**
**nomorefiles**

OK Mod... :) ho trovato il tasto. Gia' ke c sono volevo segnalare anke il NON funzionamento del tasto destro del mouse nella finestra Cattura Seriale. I tasti CTRL+C e CTRL+V invece funzionano regolarmente... Ciao, Andres

andres26: Gia' ke c sono volevo segnalare anke il NON funzionamento del tasto destro del mouse nella finestra Cattura Seriale. I tasti CTRL+C e CTRL+V invece funzionano regolarmente... Ciao, Andres

Questo si sa, ma non è un bug penso. Siccome il monitor seriale non è un vero terminale ma una semplice finestra, penso che chi ha disegnato quel form semplicemente non ha implementato la gestione dei click del mouse.

è erato l'uso della close();

tu chiudi il file se il file non esiste... ma se non esiste non è mai stato aperto :)

quindi dove va spostata la close() pechè tutto fuinzioni?

poi per amor di leggibilità cambia il

while(true) {[...]break;[...]

in

boolean fileDaLeggere=true;
while(fileDaLeggere) {[...]fileDaLeggere=false;[...]

ci ho messo un pò per capire che quel loop non era infinito....

edit: il fatto che non chiudi il file, vuol dire che la libreria tiene in memoria il descrittore del file. Puoi avevre un numero limitato di descrittori aperti in una volta sola (limitazione che esiste anche nei PC)

questo è l’esempio che si trova nell’ide 152, ho cambiato il pin 10 in 4 per la mia sheld, e ho aggiunto digitalwrite(4,1), l’ho provato e funziona

/*
  SD card basic file example
 
 This example shows how to create and destroy an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 This example code is in the public domain.
 	 
 */
#include <SPI.h>
#include <SD.h>

File root;

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(4, OUTPUT);
  digitalWrite(4,1);
  
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  root = SD.open("/");
  
  printDirectory(root, 0);
  
  Serial.println("done!");
}

void loop()
{
  // nothing happens after setup finishes.
}

void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       //Serial.println("**nomorefiles**");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
     entry.close();
   }
}

notare la close() al posto giusto… pablos, eliminandola hai lo stssoc omportamento del primo post?

se sì il caso è risolto :grin:

Grazie Pablos :) , con la close() al posto giusto funziona...

@lesto

poi per amor di leggibilità cambia il

Code:

while(true) {[...]break;[...]

in

Code:

boolean fileDaLeggere=true; while(fileDaLeggere) {[...]fileDaLeggere=false;[...]

ci ho messo un pò per capire che quel loop non era infinito....

Guarda che non l'ho mica scritto io il codice...

Come c'e' scritto + sopra nelle reply, e' un esempio che ho preso pari pari dalla pagina (http://arduino.cc/en/Reference/FileOpenNextFile), cioe' Reference -> Libraries -> SD -> openNextFile().

Un saluto a tutti, Andres :)

da segnalare nellla giusta sezione del forum...