Go Down

Topic: Libreria SD, quando chiudere un file? (Read 1 time) previous topic - next topic

paolometeo2

Sto lavorando su un datalogger che acquisisce dati dall'esterno e li scrive su una SD card, usando la libreria SD.h.  Mi e' sorto pero' un dubbio?  Se apro il file nel setup() e scrivo i dati nel loop(), dove chiudo il file? Ho provato a non chiudere il file, ma poi Windows mi fa vedere un file vuoto sulla SD.
E' necessario quindi aprire e chiudere il file ogni volta che scrivo un record, cioe' ad ogni giro di loop()?
grazie a chi mi puo' rispondere.

paolo

paolo
http://paolometeo.blogspot.it
www.meteoenergia.it

leo72

Generalmente io apro e chiudo i file proprio per evitare perdite di dati. Questo lo faccio sin da quando programmavo sui computer.

Potresti alternativamente svuotare il buffer interno con flush:
http://arduino.cc/en/Reference/FileFlush

in questo modo il file non viene chiuso ma il contenuto della ram viene comunque scritto fisicamente sul file.

pablos

Quote
ma poi Windows mi fa vedere un file vuoto sulla SD.

Se te lo fa vedere vuoto, vuoldire che non l'ha nemmeno aperto. Anch'io apro, scrivo e chiudo, comunque non credo che la libreria accetti l'apertura del file in una funzione e l'istruzione di chiusura su un altra funzione, dovrebbero almeno trovarsi dentro la stessa.

ciao
no comment

lesto

il file lo puoi aprire e chiudere da dove vuoi, l'importante è non perdere per strada il descrittore del file (FILE*) che contiene tutte le informazioni sullo stato del file.

Quindi il problema potrebbe essere che nel setup apri il file, metti il suo descittore in un puntatore FILE*, ma poi nel loop usi un altro puntatore al descrittore.

Anche non chiudendo il file qualcosa si dovrebbe leggere, arduino non bufferizza nulla (credo che flush() sia una fuinzione vuota che ti porti dietro dalla superclasse Stream) e lato SD se esiste un buffer immagino sia piccolissimo, in ogni caso chiudere il file forza la flush sia lato arduino che lato SD e risolve il prblema da questo punto di vista.

Rimane il problema che se spegni la SD mentre sta scrivendo, in particolare aggiornando le tabelle dai file/blocchi usati, rischi di spacare tutto il filesystem.
Il classico problema della rimozione sicura con le USB :)

edit: io farei un tasto che se lo premi chiudi il file e accendi un led, togli la SD, attacchi al PC, reinserisci all'arduino, ripremi il bottone e sèpegni il led e riapri la SD.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

No, flush richiama un sync sul file. Il sync è un metodo descritto nel file SD/utility/SdFile.cpp.
Anzi, è talmente importante che viene chiamato in diversi punti della libreria. Oltretutto anche la chiusura di un file non viene eseguita se non è stato fatto il sync dei dati.

paolometeo2

Ma se il datalogger acquisisce i dati per un lungo periodo di tempo (es.: un mese), non è pericoloso non chiudere mai il file? Se l'acquisizione è lenta (un dato ogni 10 s) non conviene aprire, scrivere in append e chiudere, tutto all'interno del loop??
paolo
http://paolometeo.blogspot.it
www.meteoenergia.it

lesto


Oltretutto anche la chiusura di un file non viene eseguita se non è stato fatto il sync dei dati.


anche nei codici PC la clse è sempre preceduta da una flush. probabilmente quella flush aggiorna le famose tabelle che dicevo prima.


Ma se il datalogger acquisisce i dati per un lungo periodo di tempo (es.: un mese), non è pericoloso non chiudere mai il file? Se l'acquisizione è lenta (un dato ogni 10 s) non conviene aprire, scrivere in append e chiudere, tutto all'interno del loop??


come è anche uno sopreco di risorse chiudere e aprire troppo spesso il file.. tutto dipende da quello che devi fare
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

paolometeo2

Mi chiedo, se volessi essere sicuro di salvare i dati nel caso in cui si interrompesse l'alimentazione, al più perdendo l'ultimo record, è meglio chiudere il file ogni volta?  E' vero che richiede più risorse ma anche il flush fatto ad ogni ciclo richiederà risorse.  Insomma voi come fareste?
paolo
http://paolometeo.blogspot.it
www.meteoenergia.it

leo72


Mi chiedo, se volessi essere sicuro di salvare i dati nel caso in cui si interrompesse l'alimentazione, al più perdendo l'ultimo record, è meglio chiudere il file ogni volta?  E' vero che richiede più risorse ma anche il flush fatto ad ogni ciclo richiederà risorse.  Insomma voi come fareste?



Generalmente io apro e chiudo i file proprio per evitare perdite di dati.

Se l'acquisizione è ogni 10s è molto più sicuro aprire e chiudere il file che tenerlo aperto.

paolometeo2

Grazie a tutti per i consigli. Adesso dovrò decidere se usare la SD o la SdFat.  La prima sembra che sia stata fatta sulla base della seconda, per facilitarne l'uso, ma meno performante. La seconda ha degli sketch di esempio abbastanza criptici per me. Penso che la SD per quello che debbo fare può bastare.
paolo
http://paolometeo.blogspot.it
www.meteoenergia.it

leo72


Grazie a tutti per i consigli. Adesso dovrò decidere se usare la SD o la SdFat.  La prima sembra che sia stata fatta sulla base della seconda, per facilitarne l'uso, ma meno performante. La seconda ha degli sketch di esempio abbastanza criptici per me. Penso che la SD per quello che debbo fare può bastare.


Controlla l'impiego della memoria di entrambe.
Magari una ti offre meno opzioni ma ha un impatto inferiore sul consumo di Flash e Ram.

lesto


Se l'acquisizione è ogni 10s è molto più sicuro aprire e chiudere il file che tenerlo aperto.


approvo


Quote
Grazie a tutti per i consigli. Adesso dovrò decidere se usare la SD o la SdFat.

non so se la SDfat è ancora sviluppata, per quel che ne so è stata trasformata in ufficiale cambiando il nome in SD, e non credo il progetto SDfat sia portato avanti in modo indipendente dalla SD
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

paolometeo2

L'ultima versione della SDfat risale a dicembre scorso. Io credo che questa sia la piu' completa. Invece la SD ha solo poche funzioni.
paolo
http://paolometeo.blogspot.it
www.meteoenergia.it

leo72


L'ultima versione della SDfat risale a dicembre scorso. Io credo che questa sia la piu' completa. Invece la SD ha solo poche funzioni.

Devi vedere se la SfFat ha cose in più che ti servono oppure no.
Generalmente, cose in più = Flash in più.

Go Up