Sto utilizzando la libreria SdFat per memorizzare delle stringhe di testo sulla micro Sd attraverso la Ethernet Shield per Arduino Uno.
Ciò di cui avrei bisogno, è accedere solo ad una parte del contenuto memorizzato sulla mia SD, stampando su monitor seriale solo una parte delle stringhe (e quindi non tutte).....successivamente procedere alla stampa delle rimanenti stringhe di testo su mia richiesta (magari attraverso un pulsante o insomma un comando dato da me).
Esiste qualche istruzione per poter effettuare l'accesso parziale al contenuto della Sd con la libreria SdFat?
La libreria SD permette un minimo di accesso random ai dati, ma non è una cosa molto pratica. In pratica puoi controllare i singoli byte in cerca del dato che ti serve, se sai la posizione o usi un carattere separatore la cosa si semplifica un pò.
if ( myFile.open("test.txt", O_WRITE | O_CREAT | O_AT_END));
Dovrebbe voler dire apri in scrittura il file myFile....inoltre ce' quell'attributo O_AT_END che a mio avviso dovrebbe poter voler dire apri il file fino alla fine.....dato che a me serve caricare 30 messaggi alla volta, magari cambiando quell attributo potrei ottenere cio di cui ho bisogno
if ( myFile.open("test.txt", O_WRITE | O_CREAT | O_AT_END));
Dovrebbe voler dire apri in scrittura il file myFile....inoltre ce' quell'attributo O_AT_END che a mio avviso dovrebbe poter voler dire apri il file fino alla fine.....dato che a me serve caricare 30 messaggi alla volta, magari cambiando quell attributo potrei ottenere cio di cui ho bisogno
Quel comando apre il file in quella che una volta era detta modalità "APPEND" su file MS-DOS
Vale a dire, lo apre in scrittura, e si posiziona alla fine se il file esiste, oppure lo crea se non esiste.
Ma la stampa su monitor seriale (e quindi la lettura dal file) deve avvenire accedendo a blocchi di stringhe, per ci facendo una stampa parziale ( nel mio caso di 30 stringhe alla volta), per cui devo trovare un modo per far leggere ad arduino 30 stringhe alla volta dalla SD
Sto lavorando ancora al mio progetto su Tastiera Ethernet....scrissi tempo fa un post in cui chiedevo dei consigli....
La mia tastiera consiste in un display touchscreen (della 4D system) programmato da zero in ambiente VISI, che invia dei caratteri che vengono letti da Arduino e memorizzati in un buffer progressivamente. Questi caratteri quando viene premuto il tasto invio sulla tastiera, dopo aver inserito una passowrd (attraverso la libreria Password), vengono copiati su un file di testo presente su SD e successivamente inviati su ethernet nel caso di connessione da parte di client.
La tastiera prevede piu account (tutti sotto password) a cui corrispondono diversi nomi (marco, antonio ecc ecc ).....
Cio che fa la tastiera praticamente è scrivere un messaggio, valutare la password inserita, riconoscere l'account e copiare il messaggio simultaneamente su due file (cosa fatta per ogni account) posti su SD..... un primo file è comune a tutti gli account e sarà il file che verrà letto dal client che si connette.....un secondo file è l'archivio ed è univoco per ogni account.....
Si inserisce la password e si ha il conseguente accesso all archivio che viene stampato completamente sul display.
Il mio problema nasce dall'esigenza di non avere abbastanza tempo per implementare una scroll windows sul display.....
Mi spiego meglio: il display in questione è un 7 pollici che puo visualizzare con un certo font al massimo 40 righe (dove ogni riga si suppone essere il messaggio da visualizzare nell archivio).....
Se scrivo piu di 40 messaggi quello che succede è che non sarei in grado di visualizzare i messaggi successivi (a causa delle limitate dimensioni del display). L'ideale sarebbe fare una scroll windows, ma creare una finestra di questo tipo in ambiente VISI non è facilissimo e ci vuole molto tempo.
Allora ciò che ho pensato di fare è trasmettere blocchi di stringhe predefinite......
Ho un contatore di messaggi.....quando arrivo a piu di 30 messaggi ad esempio invio un flug al display che carica un pulsante di cambio pagina......nel momento in cui premo il pulsante di cambio pagina sul display, invio un contro flag ad arduino che risponde con il secondo blocco di messaggi (da 31 a 60 ).........nel caso in cui devo tornare indietro( per cui visualizzare i messaggi da 0 a 30) premo un ulteriore pulsante di cambio pagina che invia ancora un flag ad arduino che rispnderà con i 30 messaggi iniziali....
so che è complicata la cosa ma se riuscissi ad effettuare un accesso parziale ai dati della SD, per me il problema sarebbe risolto
Attualmente ho impostato la mia lettura parziale in questa maniera:
Ho iniziato creando dei gruppi di messaggi predefiniti (via via che salvo messaggi sul file di testo presente sulla SD effettuo un conteggio).
Successivamente ad ogni blocco di messaggi (che rappresenterà la mia pagina) inserisco dei caratteri speciali; Uno all'inizio per ogni pagina e uno alla fine per indicare che la pagina è finita:
if (antonio.open("antonio.txt", O_READ // apertura file in lettura
{
int data; // variabile di appoggio numero 1
while ( (data = antonio.read()) >= 0 ) // se ho dei dati da leggere allora vado avanti
{
if( data == '%' ) // carattere speciale di inizio pagina.... se lo incontro vado avanti (il carattere dovrà esssere uguale
// per ogni pagina)
{
int prova; // variabile di appoggio numero 2
prova = antonio.read();
if( prova == '1' ) // è la prima pagina.....attualmente sto facendo delle modifiche manuali....qui inseriro' un parametro k
{ // che varierà a seconda delle pagine
int leggo; // variabile di appoggio numero 3
while(1)
{
leggo = antonio.read();
if( leggo == '&' ) break; // se incontro il carattere di fine pagina smetto di leggere ed esco dal ciclo while
Serial.write(leggo); // stampa della pagina fino alla fine del carattere speciale
}
}
data = 0;
prova = 0;
}
break;
}
antonio.close();
Il programma appena scritto fa effettivamente quello che deve fare, stampando correttamente la prima pagina.
Ma se voglio stampare la seconda pagina (cambiando semplicemente il numero 2 nella seguente istruzione:
Perchè mettere degli indici nel file, le linee sono delimitate da uno '\n', conti da 0 a 29 e visualizzi il blocco, poi da 30-59 .....
if( leggo == '\n' )
riga++;
if( riga/30 == a un numero intero) pausa lettura
anzi no
azzeri il contatore riga ... fai prima
if( riga== 29 ) pausa lettura
riga=0;
if( prova == '2' )
non legge nulla
Avete qualche consiglio da darmi?
if( leggo == '&' ) break;
il break esce dal ciclo di lettura e chiude il file .... finito non fa più niente, il ciclo nel tuo caso va sospeso non chiuso.
Praticamente mi stai dicendo di fare un conteggio delle righe in base ai caratteri '\n' che ho memorizzato nel mio file.....
Quando arrivo al trentesimo carattere \n ad esempio stampo......Fino qua ci sono....
Ma poi quando devo ripartire? mi basta azzerare il contatore per partire dalla 31 esima riga all'interno del file?
Per quanto riguarda la sospensione della lettura sono d'accordo....inseriro' un comando da tastiera che mi farà ripartire il ciclo di lettura
IL char '\n' non lo metti tu nel file è un carattere di fine linea che c'è ma non lo vedi.
devi creare un loop dentro all' while di lettura file e attendere che qualcosa lo sblocchi tipo questo
for (;;) {
//attendo un INPUT per uscire dal loop dato dal FOR
if INPUT è true allora fai un break; ed esci dal FOR
riga=0;
}
ovviamente finchè resti dentro quel for, il micro non sarà in grado di fare altro, praticamente è freezato, solo le istruzioni dentro quel for infinito saranno eseguite
void setup(){
...
...
...
char c;
byte riga;
myFile = SD.open("file.txt");
if (!myFile) Serial.println("file non trovato");
else {
while (myFile.available()) {
while(c != -1) {
c = myFile.read();
Serial.print(c);
if (c == '\n') riga++;
if (riga == 30){
for (;;) {//loop
Serial.println("pausa pagina");
//attendo un INPUT per uscire dal loop dato dal FOR
//if INPUT è true allora fai un break; ed esci dal FOR
riga=0;
}
}
}
}
myFile.close();
}
}
void loop(){
}
non l' ho provato ... ma +/- è così ... modifica il tuo e fammi sapere ... non so perchè oggi arduino non mi legge + la SD
Adesso devo implementare la lettura al contrario, per navigare tra le pagine dall'ultima pagina fino alla prima
E come fai? ogni carattere che è stato letto è sparito, ti servirebbe una ram bella grossa per farlo.
Se vuoi leggere anche su e giù tra le pagine allora come dicevi 1& 2& .... ma non avevo capito che volessi tornare indietro
In teoria si ... dovresti contare e memorizzare in quale blocco ti trovi, se premo torna indietro dovresti rileggere il file fino al blocco al quale sei arrivato -1 ... un po laborioso, dipende da quanto è lungo il file