Go Down

Topic: problema con sd.h file.read() (Read 815 times) previous topic - next topic

Peppe5k

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:

Code: [Select]

#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.

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
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

leo72

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.

niki77


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 ...   :(
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Peppe5k


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?

niki77

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.
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

pablos

#6
Jan 09, 2013, 12:57 am Last Edit: Jan 09, 2013, 01:45 am by pablos Reason: 1
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 :smiley-sweat:

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)
Code: [Select]
if (! SD.begin(4)) {
   Serial.println("Error cannot initialize SD card!");    
 }


qui dici:
Quote
ma non riesco nemmeno a scrivere e leggere correttamente una sola variabile

e poi subito dopo
Quote
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
no comment

Go Up