problema con sd.h file.read()

Salve a tutti, sto cercando di creare un file binario a lunghezza fissa con arduino mega, ethernet shield con un microsd da 4gb, ma non riesco nemmeno a scrivere e leggere correttamente una sola variabile, questo è il codice che ho usato:

#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>

int n_zone = 123;
int n;
void setup()
{
  pinMode(53,OUTPUT);
  SD.begin(4);
  Serial.begin(9600);  
}

void loop()

{

  File logfile;
  if (SD.exists("cfg.bin")) {SD.remove("cfg.bin"); }
  
  logfile = SD.open ("cfg.bin",FILE_WRITE);
  logfile.write(n_zone);
  logfile.close();

  logfile = SD.open ("cfg.bin",FILE_READ);
  logfile.read(&n,sizeof(int));
  Serial.print(n);
  logfile.close();
  
  delay(20000);
}

aprendo il file con un editor esadecimale sembra scritto giusto, ma al momento di leggere non c'è verso di leggere il valore corretto.
Ringrazio in anticipo.

Praticamente il secondo serial.print ti scrive 0?
Con l'editor esadecimale cosa leggi sul file?
Il byte 123 (0x7b) o cos' altro?

Secondo me il problema è che se rivuoi indietro un tipo int, devi prima creare un array di 4 byte (tanta è la lunghezza in byte del tipo int Arduino) e scriverla con sd.write(array, 4)
Per tagliare la testa al toro, definisci le tue variabili di tipo byte o char,vedrai che cosi funziona

Su Arduino il tipo int (o unsigned int) sono 2 byte. E' il long (e unsigned long) che sono lunghi 4 byte.

Per scrivere il dato può usare semplicemente le funzioni lowByte e highByte, oppure una union oppure le operazioni di bit shift.

leo72:
Su Arduino il tipo int (o unsigned int) sono 2 byte. E' il long (e unsigned long) che sono lunghi 4 byte.

Faccio ammenda ,non li uso quasi più questi tipi di dato ... :frowning:

niki77:
Praticamente il secondo serial.print ti scrive 0?
Con l'editor esadecimale cosa leggi sul file?
Il byte 123 (0x7b) o cos' altro?

Secondo me il problema è che se rivuoi indietro un tipo int, devi prima creare un array di 4 byte (tanta è la lunghezza in byte del tipo int Arduino) e scriverla con sd.write(array, 4)
Per tagliare la testa al toro, definisci le tue variabili di tipo byte o char,vedrai che cosi funziona

Si, nel file cfg.bin si legge un byte 0x7b, ma non riesco in nessun modo a leggerlo e riportarlo in una variabile. Dovrei quindi fare il casting in array di byte fissi prima di scrivere?
Non dovrebbe funzionare anche senza questo passaggio?

No e te l'ho spiegato sopra il perchè, servono 2 byte per fare un int.
Se ti bastano valori da 0 a 255 cambia il tipo in byte o char e sei apposto.

La SD non è un hard disk con lo sketch fatto così rovini la sheda sd, hanno un limite di scrittura anche loro soprattutto se scrivi sempre nello stesso punto :sweat_smile:

Elimina il file
Crea il file
scrivi il byte
Elimina il file
Crea il file
scrivi il byte
...
...

perchè non lo fai nel setup, se è solo una prova
la SD è formattata in FAT??

metti questo controllo al posto di SD.begin(4)

if (! SD.begin(4)) {
    Serial.println("Error cannot initialize SD card!");    
  }

qui dici:

ma non riesco nemmeno a scrivere e leggere correttamente una sola variabile

e poi subito dopo

aprendo il file con un editor esadecimale sembra scritto giusto, ma al momento di leggere non c'è verso di leggere il valore corretto.

Lo scrive il dato o non lo scrive?

sei sicuro che questo sketch fatto così ti crea il file?

ciao