Pages: [1]   Go Down
Author Topic: problema con sd.h file.read()  (Read 746 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22930
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ...   smiley-sad
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Genova
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3426
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: January 08, 2013, 07:45:38 pm by pablos » Logged

no comment

Pages: [1]   Go Up
Jump to: