Exécution du programme sans fin ?

Bonjour,

J’ai un petit soucis qui parait simple mais que je ne sais pas comment corriger …

J’ai un programme qui tourne sur mon arduino sur lequel est monté un Shields YUN.

Tout fonctionne niquel pendant 45 min et puis d’un coup il ne se passe plus rien comme si le programme s’était arrêté ou si l’ arduino s’éteignait alors que les Leds fonctionnent toujours.

Y a-t-il quelque chose à paramétrer pour qu’il puisse tourner indéfiniment ?

Merci pour votre aide.

Normalement le code tourne sans fin, c’est pas une question de paramètre. Quelque chose doit l’interrompre, il faut trouver la cause.

Est ce que tu incrémentes (sans fin) une variable dans ton programme et que certaines actions en dépendent ?

Si oui, il doit y avoir un dépassement de capacité.

Actuellement mon code est celui là :

#include <Console.h>
#include <AltSoftSerial.h>
#include <HttpClient.h>

AltSoftSerial altSerial;

void setup() {
  Bridge.begin();   // Initialize Bridge
  Console.begin();  // Initialize Console

  // Wait for the Console port to connect
  while (!Console);

  pinMode(8, INPUT);
  altSerial.begin(1200);

  Console.println("Setup OK !");
}

void loop() {
  // On récupère la trame téléinfo
  char CaractereRecu = '\0';
  String Trame;
  String trameComplete;
  int ligne = 0;
  String lignesTrame[11];
  String params;
  String query = "192.168.1.11/teleinfo_edf/insertionData.php?";
  bool trameKO = 0;

  while (CaractereRecu != 0x02) // boucle jusqu'a "Start Text 002" début de la trame
  {
    if (altSerial.available()) {
      CaractereRecu = altSerial.read() & 0x7F;
    }
  }
  while (CaractereRecu != 0x03) // || !trame_ok ) // Tant qu'on est pas arrivé à "EndText 003" Fin de trame ou que la trame est incomplète
  {
    if (altSerial.available()) {
      CaractereRecu = altSerial.read() & 0x7F;
      Trame += CaractereRecu;
      trameComplete +=CaractereRecu;
      if(CaractereRecu == 0x0D) {
        lignesTrame[ligne] = Trame;
        ligne++;
        Trame = ""; // on vide la trame pour éviter de concaténer au fur et à mesure
        }
    }
  }
  // On a terminé de recevoir la trame
  Console.println("\nTrame recue : " + trameComplete + "\n");
  
  for(int i = 0; i <= ligne; i++) {
    int decoupe = lignesTrame[i].indexOf(' ');
    String etiquette = lignesTrame[i].substring(1, decoupe); // on évite le 1er caractère qui est un saut de ligne
    String valeur = lignesTrame[i].substring(decoupe, lignesTrame[i].length()-2); // on ne prend pas les 2 derniers caractères qui ne servent à rien
    //Console.println(etiquette + " : " + valeur);
    etiquette.trim();
    valeur.trim();
    if(etiquette == "HCHP" && valeur.length() != 9) {
      trameKO = 1;
    }
    if(etiquette != "" && valeur != "" && (etiquette == "HCHC" || etiquette == "HCHP" || etiquette == "PTEC" || etiquette == "IINST" || etiquette == "PAPP" || etiquette == "HHPHC")) {
        if(etiquette == "HCHC") {
            params = etiquette+"="+valeur;
            query += params;
        } else {
            params = "&"+etiquette+"="+valeur;  
            query += params;
        }
      Console.println("query = " + query);
    }
  } 
  // fin récupération trame téléinfo

  // envoi sur le nas les données pour insertion en base de donées
  // Initialize the client library
  if(!trameKO) {
    HttpClient client;
    Console.println("On envoi la requête !");
    client.get(query);
    
    while (client.available()) {
        char c = client.read();
        Serial.print(c);
    }
    //Serial.flush();
  }
  
  
  Console.println("Fin loop");
}

Comment savoir ce qui peut poser problème ?

J'ai essayé en réinitialisant les variables du début de "loop()":

char CaractereRecu = '\0';
  String Trame = "";
  String trameComplete = "";
  int ligne = 0;
  String lignesTrame[11];
  String params = "";
  String query = "192.168.1.11/teleinfo_edf/insertionData.php?";
  bool trameKO = 0;

Je ne sais pas comment on peut initialiser le tableau "lignesTrame[11]", une idée ?

Avec ces modifications le code tourne 50 minutes ... rien de fabuleux donc :frowning:

Est-ce que si je mets toutes ces variables en global du code ça ira mieux ?

La console est muette?
Quel est le dernier message?
Est-ce toujours le même?

Sinon, le plantage pourrait être causé par l'utilisation répétée de String qui fractionne la mémoire libre.
Essaye d'utiliser les fonctions de manipulation de chaines standard C de la librairie string. C'est un peu plus lourd mais beaucoup plus stable.

Elmout:
Je ne sais pas comment on peut initialiser le tableau "lignesTrame[11]", une idée ?

Ca peut s'initialiser comme ça:

 String lignesTrame[11]={"","","","","","","","","","",""};

Mais ça ne sert rien car quand les String sont déclarées elles sont construites vides.

Est ce que tu es sur qu’il ne peut pas y avoir débordement de la table lignesTrames (par exemple si tu perds un caractère 03)
Je te conseille de mettre un test avant incrémentation de la ligne

        lignesTrame[ligne] = Trame;
        if (ligne < 11-1)
            ligne++;

J'ai rajouté ton test kamill on sait jamais effectivement :slight_smile:

J'ai également supprimé la partie

while (client.available()) {
        char c = client.read();
        Serial.print(c);
    }

qui ne sert à rien car mon code php ne renvoi rien (pas de besoin spécifique)

Je repasse d'ici 45/50 minutes pour vous dire si ça a fonctionné :slight_smile:

Bon ben mauvaise nouvelle ça n'a pas fonctionné ...

J'ai eu des enregistrements quasiment toutes les secondes ou toutes les deux secondes jusqu'à 20:40:58 puis 20:42:54 et puis plus rien ...

Je viens de changer mon code en mettant mes variables en variable global et en les ré-initialisant dans le "loop()".

La chose étrange c'est quand j'ai voulu ré-uploadé le sketch sur l'arduino il m'a dit que le port n'était pas le bon ... alors qu'il n'a pas changé dans "Outils -> Port"
L'autre chose étrange c'est que tant que je n'ai pas ouvert le moniteur de série pour voir les logs, mon traitement n'a pas l'air de se lancer ... Dès que je l'ouvre, miracle mes enregistrements commencent en base ... Bizarre non ?

Merci pour votre aide !

C'est bon ça fonctionne :slight_smile: 2 jours que ça tourne sans soucis !

J'ai déplacé les déclarations de variable en global et ça marche :slight_smile:

J'ai également supprimé le "while (!Console);" qui faisait que le programme ne se lançait pas sans que le moniteur de série soit ouvert !