Go Down

Topic: SD error code (Read 2301 times) previous topic - next topic

BigByte

Ciao a tutti,
cortesemente se mi potete aiutare su un problema nella scrittura di un file su SD, in pratica dopo un certo numero di scrittura il file viene corrotto, o in alcuni casi ricevo un messaggio di errore  "error code: 0x6", non c'è una costante nell'errore, a volte capita dopo pochi minuti, a volte dopo diverse ore. Ho provato anche a cambiare la modalità SPI sostituire la SD sia di formato che di produttore.

questo è il codice
Code: [Select]


#include <OneWire.h>
#include <DallasTemperature.h>
#include <SdFat.h>

#define ONE_WIRE_BUS 2

// SD chip select pin
const uint8_t chipSelect = 10;

SdFat sd;

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer;

unsigned long timeWait;
int numInterval;
char ID[] = "12345";


void setup(void)

  Serial.begin(19200); 
 
  sensors.begin();
  if (!sensors.getAddress(insideThermometer, 0))
     Serial.println("Unable to find address for Device 0");
       
  Serial.print("Init SD card..."); 
 
  if (!sd.begin(chipSelect,SPI_HALF_SPEED)) { //oppure SPI_SIXTEENTH_SPEED
    sd.initErrorHalt();
    Serial.print("error \n");
   
  } else { 
Serial.print("ok \n");
  }
 
  numInterval = 4;
  timeWait = 120;
 
}

void GetDataLog()
{          
        byte nlog = 1;       

do {
  delay(timeWait*1000); 
   
  ofstream sdlog("datalog.txt", ios::out | ios::app);    

  sdlog << ID << "|" <<  getTemp() << endl;                 

  if (!sdlog)
    sd.errorHalt("append failed");
             
          Serial.print(ID);Serial.println(getTemp());         
} while(nlog++ < numInterval);
}

float getTemp()

         sensors.requestTemperatures();

         return sensors.getTempC(insideThermometer);         
}


void loop(void)
{     
  GetDataLog(); 
   
/*GPRS
invio log...
*/   
}



la schield SD è posta sopra a quella del GPRS

grazie

m_ri

dopo l'errore hai provato a mettere la schedina nel pc?
durante la scrittura di dati non salta mai l'alimentazione?

nid69ita

Non sono sicuro, ma in qualche altro post avevo letto che non è sicuro tenere il file aperto in scrittura senza mai chiuderlo.
Mi sembra che nel tuo codice non chiudi mai il file.
my name is IGOR, not AIGOR

BigByte

Quando metto la scheda nel pc, il file è illegibile, l'unico modo è riformattare la sd. Ho fatto le prove con un alimentare, e non ho mai visto sbalzi ma il risultato è lo stesso.


BigByte


Non sono sicuro, ma in qualche altro post avevo letto che non è sicuro tenere il file aperto in scrittura senza mai chiuderlo.
Mi sembra che nel tuo codice non chiudi mai il file.


ok, ho aggiunto al codice

         
          sdlog.close();


faccio qualche prova e vediamo come va

leo72

Chiuderlo è sempre meglio, così svuoti anche il buffer.
Oppure puoi fare un flush() sempre per svuotare il buffer e costringere la scrittura sulla scheda dei dati in memoria (quando fai il close() viene prima fatto un flush()).

BigByte

Ho fatto delle prove e ho visto che chiudendo lo stream del file aiuta, nonostante questo il problema si è ripresentato, ho notato che succede quando ho più attività da parte della shield GPRS (problemi di linea o scarsa, ripetuti tentativi di connessione)

Chiedo scusa a m_ri per non aver testato meglio i picchi di alimentazione.
Quote

durante la scrittura di dati non salta mai l'alimentazione?



leo72

Controlla anche la RAM libera.

BigByte

Ho provato una shield sd che ha un traslatore di livello, e il problema non si è più presentato. Per info la shield monta un 74HC125

Grazie a tutti.

Ciao

nid69ita

Per inquadrare meglio, che shield SD usi? Può servire per altri utenti che magari possono risolvere con il tuo aiuto
my name is IGOR, not AIGOR

BigByte

la shield SD che ho usato adesso è questa

http://www.ladyada.net/make/logshield/

ho rimosso RTC perché non mi serviva




Go Up