Salve a tutti e grazie della possibilità che si da agli appassionati di Arduino nello scambiare idee, consigli e soluzioni varie di problematiche.
Detto questo vengo subito al punto.
Ho un problema in quanto ancora alle prime armi di Arduino...
Ho la necessità di scrivere/leggere tramite la libreria tinyfat.h su una SD delle stringhe in cui ci sono dei valori di 48 numeri ma che devo formare tramite altre stringhe di un'unica unità.
Cerco di essere più chiaro, il mio risultato che devo scrivere su un file pippo.txt deve essere formato ad esempio come 123332222111111133333322222333333333111111111122 (sono48numeri)
Ma questo numero verrà formato da 1 2 3 3 3 2 2 2 2...... E così via.
E questo vale per la scrittura, per la lettura invece farò al contrario.
C'è qualche cervellone che mi può aiutare?
Non vorrei appesantire troppo il programma dato che poi il mio Arduino Mega mi si interfaccia con un touch screen e non vorrei vedere le cose rallentate.
Porta pazienza, ma io sinceramente non ho capito. Hai una serie di numeri singoli (in un file?) e li devi mettere tutti insieme appiccicati per formare una unica stringa (senza spazi) da mettere poi in un file pippo.txt ?
Grazie mille per il benvenuto e per la replica...
in pratica io ho un file pippo.txt dove voglio leggere o scrivere numeri uno attaccato all'altro, ogni numero per me indica un'azione da fare quindi, quando lo vado a leggere lo devo scomporre in 48 variabili, quando lo vado a scrivere devo prendere le 48 variabili e formare un numero formato da 48 cifre e scriverlo nel file pippo.txt
Esempio da una stringa da 48 cifre a 48 stringhe a singola unità :
apro il file pippo.txt
leggo il file pippo.txt
estraggo il numero di 48 cifre (esempio: 112311222333332232111221333322211111333322222222)
scrivo i 48 numeri in 48 variabili (esempio: pippo[0]=1; pippo[1]=1; pippo[2]=2; pippo[3]=3; pippo[4]=1; pippo[5]=1; ecc. ecc.)
chiudo il file pippo.txt
Esempio da 48 stringhe a singola unità ad una stringa da 48 cifre:
cancello il file pippo.txt (almeno così sono sicuro di avere un file nuovo con i nuovi dati)
creo in nuovo file pippo.txt
apro il file pippo.txt
creo la nuova stringa prendendo i singoli dati (mi ritrovo 112311222333332232111221333322211111333322222222 come prima)
scrivo la nuova stringa su pippo.txt
chiudo il file pippo.txt
Sperando di essere stato un po' più chiaro aspetto vostre notizie.
Grazie mille, grazie, grazie, grazie.
Hai letto la documentazione di TinyFat ? Hai visto quali comandi (pochi) mette a disposizione?
Il lettura hai
readLn(buf,size) che cerca comunque righe di testo terminate da CR+LF
readBinary() che legge un intero settore da 512 byte e i dati sono in file.buffer[]
A te serve quest'ultimo perchè i tuoi numeri non sono su righe diverse.
Il problema maggiore è scrivere in quanto sembra ci sia solo writeLn(buf) che aggiunge SEMPRE CR+LF alla fine
Perciò non puoi mettere tutti i caratteri uniti. Cioè puoi mettere nel file uniti i numeri dentro a buf, se buf 100 caratteri 100 caratteri uniti ma alla fine di questi ci sarà CR+LF (andata a capo). Se scriverai ancore nel file (senza cancellarlo) sarà una seconda riga a capo.
Infatti la openFile() ha 3 modalità di apertura, ma binary solo in lettura (mentre in text mode c'e' read e c'e' write)
Se non è un problema avere il CR+LF alla fine dei 48 numeri puoi farlo senza problemi.
Leggerei una riga di testo in un buf[49] elementi char 0-48.
Ogni singolo numero lo vedi con buf[indice] indice 0-47 (elemento 48=fine stringa '\0')
Quando lo scrivi nel file usi una sola brutale myFile.writeLn(buf);
Ogni elemento del vettore letto buf[indice] è un carattere, perciò '1' e non 1 ovvero numero 49
diciamo che leggere e scrivere sualla SD l'ho abbastanza capito dato che sono riuscito anche a convertire variabili FLOAT in CHAR per poi scriverle e leggere dal file pippo.txt
Quello che mi resta un po' più difficile è la parte della trasformazione delle 48 variabili in una unica stringa sola....
avere caratteri in fondo alla stringa dopo i 48 numeri non è un problema, l'importante è andare a ripescare i 48 numeri e scinderli singolarmente.
Se ci fosse la maniera di farmi un piccolo esempio a riguardo male non mi farebbe
Mi scuso anticipatamente per il mio linguaggio scarno in questo campo ma sono veramente alle prime armi con questo linguaggio.... però mi sta veramente appassionando Arduino e per questo non demordo...
Grazie ancora.
Qual che non ho capito, i numeri sono 1 carattere giusto ?
Perciò è molto semplice. Leggi dal file con
myFile.readLn(buf,48);
Dove buf è un vettore di char di dimensione adeguata (fai 50).
A questo punto
for(int i=0;i<48;i++)
{ Serial.print (buf[i]); // singolo numero
if(buf[i]=='3') { // se comando '3' allora faccio....
}
In buf hai tutti i numeri ma ad un vettore puoi accedere a ogni singolo elemento. Ricorda solo che l'elemento è un numero inteso come carattere, '1' non è il valore 1 ma è 49 ovvero in tabella ascii vedrai '0'=>48 '1'=>49 etc.
scrivo i 48 numeri in 48 variabili (esempio: pippo[0]=1; pippo[1]=1; pippo[2]=2; pippo[3]=3; pippo[4]=1; pippo[5]=1; ecc. ecc.)
mi sembra che voglia anche memorizzarli in un array, non leggerli e usarli una sola volta.
Un array di string è pesante, andrebbero convertiti in byte
Posso sapere questi valori 1-2-3 cosa fanno nel tuo scketh, magari ti si può dare un'idea o una soluzione più semplice.
Dalla descrizione sono solo 48 cifre, perciò un vettore di 48 caratteri, non mi sembra grosso.
Inoltre una stringa non è altro che un array/vettore di caratteri e se ogni cifra è solo da 1 a 9 come numero occuperesti comunque un byte.
Se la descrizione che ha dato è esaustiva.