Programmation Pb corruption mémoire ? Adruino Yun

Bonjour,

J'ai développe un premier sketch qui me permet de gérer ma domotique (volets chauffage etc...)
Un deuxième sketch qui me permet de relever mon compteur EDF.
Les deux, séparément,fonctionnent .
Je commence à rencontrer des problèmes quand je tente d’intégrer les deux modules en un seul.

Il semble qu'a partir d'un certain volume de code tout se plante !

en pj mon code: TestDate.
une trace avec une premier code qui fonctionne (Trace 1).
un extrait du code ok (codeOK.)
une trace du code qui ne fonctionne plus (Trace 2) (plus de date))
un extrait du code qui ne fonctionne plus. (CodeNonOK)

J'avoue ne plus savoir dans quelle direction chercher.

auriez-vous des pistes à me suggérer ?

Merci

TestDate.ino (16 KB)

Salut

Je ne vois pas de différence entre CodeOK et CodeNonOK. Une erreur de copie d'écran ?

Dans la fonction getTimeStamp :

 String getTimeStamp() {  
          String result="";    // un objet sur la pile disparaît lors du return
          Process time;
          time.begin("date");
          time.addParameter("+%Y/%m/%d-%T");  
          time.run();     

      while(time.available()>0) {
        char c = time.read();
        if(c != '\n')
        result += c;
        } 
       
     return result;
     Console.println (result);    // ne sera jamais exécuté
     Console.print ("Result ");
     delay (500);
}

ARDUINO YUN est une petite plateforme avec seulement 2.5 Ko de RAM.
Avec toutes ces String, cela m'étonnerait que cela ne génère pas une fragmentation de la mémoire à très court terme.

VIRER LES String et travailler avec des c-strings : char * ou char[].

NOTE : il est facile de copier coller une trace en mode texte depuis la console. Je veux bien que les habitués de Windows soient accros à la copie d'écran, mais ce n'est vraiment pas pratique pour nous, en particulier pour copier un nom de fonction, de variable, ou faire un diff de deux fichiers (impossible avec deux images).

@+

Bonjour,

Merci pour cette piste je vais m'attaquer aux String

le code n est pas tout a fait identique.
ça fonctionne dans le cas ou je met une partie du code en commentaire....

void initlog() {
  Console.println ("initlog command");
}
/*
  if ( JR == 1 ) {
    File LogDomo = FileSystem.open ("/mnt/sd/LogDomo.txt", FILE_WRITE);        //RAZ du fichier log
    delay (100);
    LogDomo.println("To: jacques.waller@free.fr");
    delay (100);
    LogDomo.println("From: jacques.waller@free.fr");
    delay (100);
    LogDomo.println("Subject: DomoCharbo Fichier log");
    delay (100);
    LogDomo.println("");
    delay (100);
    LogDomo.close();
    delay (100);
  }
  else {
    File LogDomo = FileSystem.open ("/mnt/sd/LogDomo.txt", FILE_APPEND);      //  ouverture en mode append
    delay (100);
  }

}

*/

CodeNonOK.txt (732 Bytes)

CodeOk.txt (657 Bytes)

TraceNonOK.txt (800 Bytes)

TraceOK.txt (1.02 KB)

Le plus important : la variable locale result dans la fonction getTimeStamp doit être static.

static String result;
// aurait avantage à être remplacée par un c-string
static char result[20];

20 caractères sont suffisant pour le timestamp.
Ensuite, il faut remplacer les opérateurs et méthodes C++ par leur équivalents C. Il y a un peu de travail.

@+

Bonjour,

J'ai fais une tentative avec static Char
Mais j'ai toujours le même symptôme

La date est correcte au premier passage dans la boucle, puis ça s'égare....

void dateheure ()
{
 

  int i = 0;
  AN = 0;
  while (i < 10 && AN != 18) {
    dateHeur = getTimeStamp();
    date = dateHeur.substring(0, 10);
    heur = dateHeur.substring (11, 19);
    hh = dateHeur.substring (11, 13);
    HH = hh.toInt();
    mm = dateHeur.substring (14, 16);
    MM = mm.toInt();
    an = dateHeur.substring (2, 4);
    AN = an.toInt();
    ms = dateHeur.substring (5, 7);
    MS = ms.toInt();
    jr = dateHeur.substring (8, 10);
    JR = jr.toInt();
   
    DateSys = AN * 1000 + MS * 100 + JR;
    xdate4 = dateHeur.substring (0, 19);
    i++;
  }
  if ( AN != 18) {
    Console.println ("echec Date");
  }
  }



String getTimeStamp() {
  static char result[20];
  int z = 0;
  Process time;
  time.begin("date");
  time.addParameter("+%Y/%m/%d-%T");
  time.run();

  while (time.available() > 0) {
    char c = time.read();
    if (c != '\n')
    Console.print (c);
    result[z] += c;
    z++;
  }
  
  Console.print ("Result = ");
  Console.println (result);
  delay (500);
  return result;

}
Console Ready
Loop 
2018/10/26-17:26:58Result = 2018/10/26-17:26:58

DateHeurProcess 2018/10/26-17:26:58

command = status
Status command
Loop 
2018/10/26-17:27:00Result = d`bp^b`^dlZbntdmteh
2018/10/26-17:27:01Result = –�“¨�“��–¢‡“¥®–¤®•™
2018/10/26-17:27:02Result = ÈÀÄà¼ÄÀ¼ÈØ´ÄÜèÈÛèÅË(
2018/10/26-17:27:03Result = úðõëõðëúáõ"ú"õþ2
2018/10/26-17:27:03Result = , &P& ,D&J\,I\%1<
2018/10/26-17:27:04Result = ^PWˆIWPI^z;W�–^€–UeF
2018/10/26-17:27:05Result = �€ˆÀxˆ€x�°hˆ¸Ð�·Ð…šP
2018/10/26-17:27:06Result = °¹ø§¹°§Â敹ï
Âî
µÐZ
2018/10/26-17:27:06Result = ôàê0ÖêàÖôÂê&Dô%Dåd
2018/10/26-17:27:07Result = &ehe&Rïe]~&\~=n
echec Date
DateHeurProcess &ehe&Rïe]~&\~=n
command = status
Status command
Loop 
2018/10/26-17:27:09Result = X@L 4L@4XˆL”¸X“¸Evx
2018/10/26-17:27:10Result = Šp}Øc}pcоI}ËòŠÊòv¦‚
2018/10/26-17:27:11Result = ¼ ®’® ’¼ôv®,¼,§×Œ
2018/10/26-17:27:11Result = îÐßHÁßÐÁî*£ß9fî8fØ–
2018/10/26-17:27:12Result =  
2018/10/26-17:27:13Result = R0A¸A0R–ýA§ÚR¦Ú:mª
2018/10/26-17:27:14Result = „`rðNr`N„Ì*rÞ„Ýk¡´
2018/10/26-17:27:14Result = ¶�£(}£�}¶W£N¶NœÕ¾
2018/10/26-17:27:15Result = èÀÔ`¬ÔÀ¬è8„ÔLˆèKˆÍ
È
2018/10/26-17:27:16Result = ð˜ÛðÛn±ƒÂ‚Âþ@Ò
echec Date
DateHeurProcess ð˜ÛðÛn±ƒÂ‚Âþ@Ò
command = status
Status command
Loop

TestDate.ino (14.6 KB)

Évite la classe String.

A mon avis :

String getTimeStamp() {    // n'est pas correct
char *getTimeStamp() {     // c'est mieux

Mais ton problème se produit après l'appel à getTimeStamp puisqu'à la fin de cette fonction tu affiches :

Console.println (result);
Console.print ("Result ");

Ensuite un signe "=" est affiché puis à nouveau une date et une heure, qui pose problème.
Il faudrait avoir le code complet.

@+

ok merci pour ces commentaires,

je fais les modifs et test a mon retour de déplacement dans 15 jours