Pages: [1]   Go Down
Author Topic: Libreria SD, quando chiudere un file?  (Read 893 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 4
Posts: 148
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3255
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

no comment

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10448
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

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.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Full Member
***
Karma: 4
Posts: 148
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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??
Logged


0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10448
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Full Member
***
Karma: 4
Posts: 148
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Full Member
***
Karma: 4
Posts: 148
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10448
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Full Member
***
Karma: 4
Posts: 148
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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ù.
Logged


Pages: [1]   Go Up
Jump to: