Buon giorno a tuttti, sono a chiedere un aiuto perche mi trovo in difficolta nel salvare dei dati di configurazione su un file esterno, senza usare troppa memoria.
Ho trovato una libreria per i file ini, ma a quanto pare legge solo i dati da un determinato file e non li scrive, io invece ho la necessita dia di leggerli che di scriverli.
Qualcuno a qualche consiglio per trovare una soluzione intelligente che non mi occupi troppa memoria..
Stai parlando di un file su SD collegata ad Arduino, vero? O di qualcosa su PC ?
La libreria per SD collegata ad Arduino è pesante, esiste una versione più leggere TinyFat, ma occupa comunque molto. Scrivere un file non è una cosa semplice.Non è la semplice memoria ram. C'e' tutta la gestione di FAT, tabelle allocazione, etc.
vic_20:
Buon giorno a tuttti, sono a chiedere un aiuto perche mi trovo in difficolta nel salvare dei dati di configurazione su un file esterno, senza usare troppa memoria.
Sicuro che non ti basta la EEPROM del 328 ?
Eventualmente puoi collegare una EEPROM esterna molto più capiente e decisamente più semplice da gestire di una SD.
Per essere più chiaro vi spiego un po cosa sto cercando di realizzare:
Il progetto e molto ambizioso per me ma spero di riuscire a realizzarlo, per ora ho creato alcune pagine web sulla sd card della ethernet shield, con file css separato, che dovrà visualizzare tramite ajax alcuni parametri di temperatura, stato contatti..ecc
Il file (ini) nella sd mi serve per poter memorizzare ed eventualmente modificare alcune configurazioni del sistema, il fatto di voler utilizzare la sd e per essere più libero, visto che la sd e già utilizzata.
Cercherò di creare un metodo che mi dia la possibilità di leggere e scrivere il mio file ini, la mia paura e che mi porti via troppa memoria per le variabili.
Ora non mi è chiara una cosa. Se già utilizzi la SD per le pagine web, allora utilizzi già una libreria per SD. Quale? Quella fornita assieme al IDE ?
E quest'altra libreria per legger file INI, hai un link ?
Io ho visto questa: GitHub - stevemarple/IniFile: Arduino library to parse ini files.
e citandola: "IniFile is designed to use minimal memory requirements, and the only buffer used is one supplied by the user, thus the user remains in charge of memory usage."
Inoltre nel "IniFile.h" della libreria si vede che c'e' una chiamata a "SD.h" quindi si basa sulla libreria fornita con IDE.
Sembra aggiungere solo uno "strato" di libreria adatta a leggere i file INI stile windows.
Non è semplice capire quanta SRam in più consuma. Bisogna fare delle prove con e senza questa lib.
Anche io ho visto quella libreria, ma se non ho capito male serve solo a leggere i dati dal file ini, non a scriverli, io invece oltre che leggerli ho bisogno di poterli anche modificare.
Capisco. Ma un file ini di solito è in lettura per il programma. Una persona con editor lo modifica/compila.
Se devi modificarlo è più un file di log e la cosa è complicata, anche perchè in un file di testo è semplice aggiungere al fondo, molto più difficile modificare/cancellare parti in mezzo. Se devi solo "sovrascrivere" una parola già presente con una di uguale (ma proprio UGUALE) lunghezza la cosa non dovrebbe essere complessa.
Si hai centrato il problema, io non devo aggiungere stringhe, devo modificare una configurazione, per esempio cambiare indirizzo ip, un valore di temperatura, ecc, certo e che la lunghezza della stringa deve essere sempre uguale o minore di quella precedente non sara mai superiore.
Pensi sia possibile usare la libreria ini di cui parlavamo prima per farlo, o devo scrivere tutto da capo?
Forse usando la lib per leggere e la standard per SD per scrivere ma essendo sicuro che quello che sovrascrivi ha la stessa lunghezza di quel che c'e' nel file.
Bisogna vedere se la libreria INI permette di sapere la posizione di dove ha letto, la libreria SD, su cui si basa ha questa funzione uint32_t File::position()
Quindi aprendo il file in quel punto usando boolean File::seek(uint32_t pos) e scrivendo con la write (file aperto in scrittura, credo la libreria INI apre solo in lettura) dovrebbe sovrascrivere.
Dovro leggermi bene tutta la libreria, ho visto la funzione di cui parli nel file iniFile.h , ora devo fare un po di prove, non ho ancora capito se mi conviene modificare la libreria o riesco a usare la funzione write per sd, mi sa arrivando! che mi ci vorra un bel po di tempo ma forse e l'unica soluzione attuabile per risparmiare memoria, anche perché penso che sarebbe molto utile a tanti....