Go Down

Topic: fuite de mémoire et datalogguing ! (Read 657 times) previous topic - next topic

Heloderma-kris

Salut a tous
j'ai un problème de perte de mémoire sur mon système j'ai réussi a isoler la partie responsable m'ai je n'arrive pas a trouver la raison de cette perte de mémoire.

en gros j'utilise pour visualiser la mémoire utiliser la librairie MemorieFree.h et sur le terminal série je vois qu'a chaque fois que j'exécute mon code de dattalogguing je perd en mémoire RAM 31 octet , du coup au bout de quelque temps l'arduino plante.

je pige pas d'où ça viens!

voici mon code de dattalogging :
Code: [Select]
void DattaLog(){

  char nomfichier [13];
  sprintf(nomfichier, "%02i%02i%04i.txt", day, month, year);//affichage heure et date

  file = SD.open(nomfichier, FILE_READ); 
  if (file==false) {
    file =SD.open(nomfichier, FILE_WRITE);
    if( file==true){
      file.print(F("Fichier du : "));
      file.print(day);
      file.print(F("/"));
      file.print(month);
      file.print(F("/"));
      file.println(year);
      file.print(F("heure de lever : "));
      file.print(int(Time_ON/3600));
      file.print(F("H"));
      file.println(int(float (Time_ON)/60-(floor(float(Time_ON)/3600)*60)));
      file.print(F("heure de coucher : "));
      file.print(int(Time_OFF/3600));
      file.print(F("H"));
      file.println(int(float (Time_OFF)/60-(floor(float(Time_OFF)/3600)*60)));
      file.print(F("Duree d'eclairage : "));
      file.print((float(Time_OFF)-float(Time_ON))/3600);
      file.println(F("H"));
      file.println(F("les donnees sont au format suivant : "));
      file.println(F("temps;Temperature piece; Temperature Terra; humidite Piece "));
      file.print(temps());
      file.print(F(";"));
      file.print(temp_sonde[sonde_piece]);
      file.print(F(";"));
      file.print(temp_sonde[sonde_terra]);
      file.print(F(";"));
      file.println(HumiditePiece);
    };
  }
  else{
    file =SD.open(nomfichier, FILE_WRITE);
    if( file==true){
      long fin=file.size();
      file.seek(fin+1L);
      sprintf(Buff_afichage, "%02i:%02i:%02i", hour, min, sec);//impresion heure
      file.print(Buff_afichage);
      file.print(F(";"));
      file.print(temp_sonde[sonde_piece]);
      file.print(F(";"));
      file.print(temp_sonde[sonde_terra]);
      file.print(F(";"));
      file.println(HumiditePiece);
    };
  };
  file.close();
  return;
}


merci ;)

fdufnews

Je ne connais pas très bien la librairie SD mais je vois que tu fais 2 SD.open mais tu ne fais qu'un close.
Peut être tenter ça:
Code: [Select]
void DattaLog(){

  char nomfichier [13];
  sprintf(nomfichier, "%02i%02i%04i.txt", day, month, year);//affichage heure et date

  file = SD.open(nomfichier, FILE_READ); 
  file.close();    // au cas ou un tampon ne serait pas libéré implicitement lorsque tu fais un open juste après.
  if (file==false) {
    file =SD.open(nomfichier, FILE_WRITE);
    if( file==true){
      file.print(F("Fichier du : "));

Heloderma-kris

en faisant ce que tu m'indique la seconde partie de ma fonction , a savoir , ecrire des donnée a la fin du fichier , ne marche plus , mais il n'y a plus de fuitede memoir je regarde donc ce qui peut bloquer dans la seconde partie du programe!

Heloderma-kris

#3
Feb 14, 2013, 02:45 pm Last Edit: Feb 14, 2013, 05:11 pm by Heloderma-kris Reason: 1
Bon j'y comprend rien j'ai trafiqué le code de ma fonction et maintenant sa marche mais je suis incapable de dire pourquoi!!! :smiley-eek:
enfin merci de ton aide et voici le code de la fonction qui je pense peut servire a d'autre ;)
Code: [Select]
void DattaLog(){

 char nomfichier [13];
 long fin;
 boolean fichierok;
 sprintf(nomfichier, "%02i%02i%04i.txt", day, month, year);//affichage heure et date
 sprintf(Buff_afichage, "%02i:%02i:%02i", hour, min, sec);//impresion heure

 fichierok= SD.exists(nomfichier);
 
 file =SD.open(nomfichier, FILE_WRITE);
 if(file==true){
 if (fichierok==false) {
   
     file.print(F("Fichier du : "));
     file.print(day);
     file.print(F("/"));
     file.print(month);
     file.print(F("/"));
     file.println(year);
     file.print(F("heure de lever : "));
     file.print(int(Time_ON/3600));
     file.print(F("H"));
     file.println(int(float (Time_ON)/60-(floor(float(Time_ON)/3600)*60)));
     file.print(F("heure de coucher : "));
     file.print(int(Time_OFF/3600));
     file.print(F("H"));
     file.println(int(float (Time_OFF)/60-(floor(float(Time_OFF)/3600)*60)));
     file.print(F("Duree d'eclairage : "));
     file.print((float(Time_OFF)-float(Time_ON))/3600);
     file.println(F("H"));
     file.println(F("les donnees sont au format suivant : "));
     file.println(F("temps;Temperature piece; Temperature Terra; humidite Piece "));
     file.print(Buff_afichage);
     file.print(F(";"));
     file.print(temp_sonde[sonde_piece]);
     file.print(F(";"));
     file.print(temp_sonde[sonde_terra]);
     file.print(F(";"));
     file.println(HumiditePiece);
     };
if (fichierok==true) {
     fin=file.size();
     file.seek(fin+1L);
     file.print(Buff_afichage);
     file.print(F(";"));
     file.print(temp_sonde[sonde_piece]);
     file.print(F(";"));
     file.print(temp_sonde[sonde_terra]);
     file.print(F(";"));
     file.println(HumiditePiece);
};
};
 file.close();
 return;
}


fdufnews

Code: [Select]
en faisant ce que tu m'indique la seconde partie de ma fonction , a savoir , ecrire des donnée a la fin du fichier , ne marche plus
Logique (en même temps je n'y avais pas pensé avant) en faisant file.close on perd l'état qui est testé ensuite.

Je pense que cette version (qui reprend ta 1ère version) devrait fonctionner
Code: [Select]
void DattaLog(){

  char nomfichier [13];
  sprintf(nomfichier, "%02i%02i%04i.txt", day, month, year);//affichage heure et date

  fichierok= SD.exists(nomfichier);
 
  if (fichierok==false) {
    file =SD.open(nomfichier, FILE_WRITE);
    if( file==true){
      file.print(F("Fichier du : "));
      file.print(day);
      file.print(F("/"));
      file.print(month);
      file.print(F("/"));
      file.println(year);
      file.print(F("heure de lever : "));
      file.print(int(Time_ON/3600));
      file.print(F("H"));
      file.println(int(float (Time_ON)/60-(floor(float(Time_ON)/3600)*60)));
      file.print(F("heure de coucher : "));
      file.print(int(Time_OFF/3600));
      file.print(F("H"));
      file.println(int(float (Time_OFF)/60-(floor(float(Time_OFF)/3600)*60)));
      file.print(F("Duree d'eclairage : "));
      file.print((float(Time_OFF)-float(Time_ON))/3600);
      file.println(F("H"));
      file.println(F("les donnees sont au format suivant : "));
      file.println(F("temps;Temperature piece; Temperature Terra; humidite Piece "));
      file.print(temps());
      file.print(F(";"));
      file.print(temp_sonde[sonde_piece]);
      file.print(F(";"));
      file.print(temp_sonde[sonde_terra]);
      file.print(F(";"));
      file.println(HumiditePiece);
    };
  }
  else{
    file =SD.open(nomfichier, FILE_WRITE);
    if( file==true){
      long fin=file.size();
      file.seek(fin+1L);
      sprintf(Buff_afichage, "%02i:%02i:%02i", hour, min, sec);//impresion heure
      file.print(Buff_afichage);
      file.print(F(";"));
      file.print(temp_sonde[sonde_piece]);
      file.print(F(";"));
      file.print(temp_sonde[sonde_terra]);
      file.print(F(";"));
      file.println(HumiditePiece);
    };
  };
  file.close();
  return;
}


Go Up