aiuto con Fat16lib

Salve a tutti

Sto lavorando su un progetto in cui ho la necessità di scrivere dei caratteri provenienti da tastiera su un file di testo memorizzato in una sd card su Ethernet shield.
L'operazione di scrittura su Sd card non è difficile, ma il problema che ho è quello di voler cancellare in un istante successivo questi dati che ho scritto....Cerco di spiegarmi meglio:
Sostanzialmente sto cercando di creare una sorta di chat su rete ethernet, in cui i caratteri sono memorizzati su Sd e successivamente immessi su ethernet. Sono facilmente riuscito a immettere arduino in rete facendo leggere ciò che ho scritto all'interno del file txt memorizzato su SD e a farlo vedere ad altri PC connessi sulla stessa rete ethernet. Il problema è che purtroppo avrei la necessità di cancellare cio che ho scritto, dato che tutte le stringhe memorizzate all'interno della SD non si cancellano, ma vengono affiancate.......

Come dice il titolo della discussione, potrei utilizzare la libreria Fat16 lib per SD card (volendo ad esempio cancellare il file di testo e ricrearne un altro sul quale scrivere altri caratteri, oppure cancellare i caratteri da me memorizzati precedentemente e scriverne altri)

Consigli? Grazie come sempre :slight_smile:

Essendo il comando di apertura per scrittura in append (accodamento):
FILE_WRITE: open the file for reading and writing, starting at the end of the file

non ti rimane che eliminare fisicamente il file (devi prima chiuderlo).

Ma poi una volta che il file è stato eliminato ? non posso piu scrivere nulla sulla SD o Arduino me ne crea automaticamente un altro di file txt?

Mica ho capito. Scusa ma la prima volta come crei quel file, non dai tu dei comandi da codice Arduino? :fearful:
Non usi una open() con parametro FILE_WRITE ? Quello se il file non c'e' lo crea. Oppure non ho capito nulla io.

@ Nid : mi sa che lui il file sulla SD ce lo mette da PC :wink:

Guglielmo

Comunque lo può eliminare e ricreare con la lib:
https://code.google.com/p/fat16lib/
Ha dei metodi che permettono di farlo: file.remove() serve proprio per eliminare un file.

Esatto Gugliemo...il file lo metto io da PC.....
file.remove cosa fa esattamente Leo? elimina cio che ho scritto oppure elimina tutto il file txt? In ogni caso l'ideale è non mettere nessun file sulla Sd da computer e crearne automaticamente uno da Arduino.......

puoi anche solo svuotare il file senza eliminarlo con TRUNC | WRITE

file.remove() elimina il file fisicamente, da quel che ho capito, tu dovresti prima leggerlo, trovar la stringa da cancellare , poi creare un altro file con lo stesso contenuto meno quella stringa....right!? :roll_eyes:
Il mio consiglio è di leggerlo ogni volta che arriva un nuovo messaggio, ed eliminare il messaggio più vecchio...ovvero ricreare il file con le righe successive alla prima. IMHO

Ale devo scrivere delle parole all'interno di un file txt memorizzato all'interno di una micro SD su shield Ethernet
(successivamente il contenuto di questo file di testo dovrà essere messo su Ethernet e letto da altri computer collegati sulla stessa rete digitando semplicemente l'indirizzo IP al quale è connesso Arduino, ma gia ho risolto questo problema ....)
Il problema è il seguente:

  1. File txt completamente vuoto.....scrivo ad esempio Ciao e sulla rete i computer connessi ad Arduindo visualizzeranno Ciao (e qui va bene)
  2. La SD adesso ha una situazione in cui ha memorizzato sul file di testo Ciao......se provo a cambiare parola digitando ad esempio Rosso, la stampa a video sugl altri computer sarà CiaoRosso
  3. e cosi via per altre parole che quindi andranno ad affiancarsi progressivamente.

Dovendo di fatto avere la necessità di scrivere delle parole, frasi, dati ecc.... che voglio memorizzare sulla mia SD, ho anche la necessità di dover cancellare queste parole che ho scritto precedentemente, per cui l'ideale sarebbe scrivere la prima parola, farla vedere ai pc in rete, poi successivamente scrivere un altra parola cancellando possibilmente la parola digitata precedentemente e far visualizzare (aggiornando semplicemente la pagina web sui PC ) la nuova parola digitata.....e cosi via......

tntsix:
Dovendo di fatto avere la necessità di scrivere delle parole, frasi, dati ecc.... che voglio memorizzare sulla mia SD, ho anche la necessità di dover cancellare queste parole che ho scritto precedentemente, per cui l'ideale sarebbe scrivere la prima parola, farla vedere ai pc in rete, poi successivamente scrivere un altra parola cancellando possibilmente la parola digitata precedentemente e far visualizzare (aggiornando semplicemente la pagina web sui PC ) la nuova parola digitata.....e cosi via......

Perdona tntsix, ma ... ho idea che tu debba metterti li e studiare bene la libreria SD ...

Esistono apposite funzioni per "posizionarsi" all'interno di un file (seek()) e per poter quindi legger/scrivere da una determinata posizione.

Credo che per risolvere il problema, basta che tu gestisci bene il contenuto del tuo file ...
... ad esempio, semplicemente posizionandoti all'inizio, puoi sovrascriverne il contenuto aggiornandolo.

La libreria offre moltissime altre funzioni per la gestione del contenuto di un file ... :roll_eyes:

Guglielmo

Esistono apposite funzioni per "posizionarsi" all'interno di un file (seek()) e per poter quindi legger/scrivere da una determinata posizione.

leggere da una determinata pos si, ma sostituire solo alcuni char in determinate pos non puoi, ne abbiamo discusso altre volte

comunque sia, la sd è come una eeprom o una flash, se vai a scrivere troppe volte sugli stessi cluster (cancellare equivale a scrivere un altra volta) ti dura poco.
se sono poche parole non potresti usare un po' di ram?

pablos:
leggere da una determinata pos si, ma sostituire solo alcuni char in determinate pos non puoi, ne abbiamo discusso altre volte

Scusa ... mi dai un link ? Perché, stando alle funzioni, la cosa sembra invece fattibile ... :roll_eyes:

Guglielmo

pablos:
leggere da una determinata pos si, ma sostituire solo alcuni char in determinate pos non puoi, ne abbiamo discusso altre volte

Provato ... mi sa che ne avete discusso male ... ]:smiley: ]:smiley: ]:smiley:

#include <SD.h>

File myFile;

void setup()
{
   delay(1000);
   //
   Serial.begin(9600);
   Serial.print(F("Initializing SD card..."));
   if (!SD.begin(4)) {
      Serial.println(F("initialization failed!"));
      return;
   }
   Serial.println(F("initialization done."));
   Serial.println();
   //
   if (SD.exists("test.txt")) {
      SD.remove("test.txt");
   }
   //
   myFile = SD.open("test.txt", FILE_WRITE);
   if (myFile) {
      Serial.print(F("Writing 1234567890ABCDEF to test.txt..."));
      myFile.println("1234567890ABCDEF");
      myFile.close();
      Serial.println(F("done."));
   }
   else {
      Serial.println(F("error opening test.txt"));
      return;
   }
   Serial.println();
   //
   delay(1000);
   //
   Serial.println(F("Opening test.txt for modify"));
   myFile = SD.open("test.txt", FILE_WRITE);
   Serial.println(F("Moving to the BOF"));
   myFile.seek(0);
   Serial.println("reading: ");
   while (myFile.available()) {
      Serial.write(myFile.read());
   }
   Serial.println();
   Serial.println(F("Moving to the third char and replacing with X"));
   myFile.seek(2);
   myFile.write('X');
   myFile.close();
   Serial.println(F("done."));
   //
   delay(1000);
   Serial.println(F("Opening test.txt for reading back"));
   myFile = SD.open("test.txt", FILE_READ);
   Serial.println("Reading: ");
   while (myFile.available()) {
      Serial.write(myFile.read());
   }
   Serial.println();
   Serial.println(F("done."));
}

void loop() {

}

... lancialo e poi mi dici :wink:

Guglielmo

@ tntsix : questo è un esempio di come riposizionarsi all'interno di un file ed effettuare delle modifiche :wink:

I file ad accesso casuale esistono dai tempi del DOS, sono insiti nella FAT, mi pareva strano infatti che non si potesse fare. Casomai forse c'è il dubbio sulla "tenuta" della Flash delle schede SD, visto che esse lavorano meglio con cluster di grosse dimensioni, che siano equivalenti alla dimensione della pagina che la stessa Flash gestisce in un blocco solo (per limitare il numero di scritture).
Ho poi trovato un interessante post di fat16lib, l'autore dell'omonima libreria, dove suggerisce un formattatore che ottimizza la struttura dei file in base al chip di gestione della Flash stessa.
http://forum.arduino.cc/index.php/topic,128875.0.html

leo72:
...
Ho poi trovato un interessante post di fat16lib, l'autore dell'omonima libreria, dove suggerisce un formattatore che ottimizza la struttura dei file in base al chip di gestione della Flash stessa.

Ottimo ... oltretutto esiste sia per Win che per Mac !

Guglielmo

Grazie Gugliemo....come sempre gentilissimo!