Bonjour à tous,
Je suis entrain de me battre avec un problème que j'ai eu plusieurs fois et dont celui-ci c'est réglé soit par chance, soit par une incompréhension de ma part.
Ici, je suis face à ce problème encore une fois, que je n'arrive pas à résoudre.
En gros, quand je donne des instructions dans le loop(), le code fonctionne parfaitement sans erreurs ni fuite de mémoire ( testé avec memoryFree ), et ce pendant plusieurs heures. Je suppose donc qu'il n'y a pas de soucis de ce côté là.
Voulant avoir un code un peu plus propre, je me décide de retirer ces quelques instructions du loop() et de créer une fonction "connectionToDevice" faisant exactement la même chose. Bref, que du copier-coller. Or, il se fait que mon programme crash sans raison apparente. Toujours avec la libairie memoryFree, il n'y a aucun soucis de mémoire.
Le code fonctionnel est ci-dessous.
Fonctionnement de Communication :
J'attends que l'utilisateur envoie "yes" pour pouvoir démarrer une communication.
Si la communication démarre j'exécute certaines instruction ( Notamment je lui demande une "action" ), sinon non.
En gros ce qui se passe dans la console :
-J'attends qu'on m'envoie "ready", j'envoie alors "yes" -> communication
-Ensuite, j'envoie 50, je rentre dans le cas defaut du switch de actionListener
-Print des autres Serial.
void loop()
{
Serial.print("first sec : ");
//connectionToDevice();
//connectionToDevice();
char action[10] = {'\0'};
if(com.tryCommunication())
{
com.sendInformations("connection");
com.recieveInformations(action,10);
Serial.println(action);
actionListener(action);
Serial.println("Crash apres action");
}
Serial.println("on est passe :");
switch(counter)
{
case 0 :
Serial.println("on est dans case 0");
default :
counter = 0;
}
}
Sachant que "counter" est une variable global
La classe Communication :
#include "Communication/Communication.h"
#define TIME_MAX_WAIT_COMM 4// in seconds
#define MAX_LENGTH_INFO 10
Communication::Communication()
{
}
bool Communication::tryCommunication()
{
Serial.println(F("ready?"));
delay(100);
char test[MAX_LENGTH_INFO]= {'\0'};
if(!recieveInformations(test,MAX_LENGTH_INFO))
return false;
if(strcmp(test,"yes")==0)
{
return true;
}
return false;
}
bool Communication::recieveInformations(char tab[], byte lenghtTab)
{
byte mill = 0;
byte i;
while(!(Serial.available()>0) && ((mill)<TIME_MAX_WAIT_COMM))
{
delay(1000);
mill++;
}
for( i=0; i<lenghtTab; i++) // on initialise
{
tab[i] = '\0';
}
for( i=0; Serial.available()>0 && i<lenghtTab; i++)
{
tab[i] = Serial.read();
}
if(i==0)
return false;
else
return true;
}
void Communication::sendInformations(String toSend)
{
Serial.println(toSend);
}
La fonction actionListener
void actionListener(char event[])
{
Serial.println(event);
byte action = atol(event);
char line[50] = {'\0'};
char fileName[10] = {'\0'};
long secLight;
switch(action)
{
case WRITE_AND_DELETE :
// code inutile
break;
case PLAY_24_HOURS_LIGHTS :
//code inutile
break;
case WRITE_END_OF_FILE :
// code inutile
break;
default :
Serial.println("envoye yes !");
Serial.print("freeMemory()=");
Serial.println(freeMemory());
com.sendError(100);
break;
}
delay(1000);
Serial.println("Ccrash actionListener");
}
Code non fonctionnel :
void connectionToDevice();
void loop()
{
Serial.print("first sec : ");
connectionToDevice();
connectionToDevice();
Serial.println("on est passe :");
switch(counter)
{
case 0 :
Serial.println("on est dans case 0");
default :
counter = 0;
}
}
void connectionToDevice()
{ char action[10] = {'\0'};
if(com.tryCommunication())
{
com.sendInformations("connection");
com.recieveInformations(action,10);
Serial.println(action);
actionListener(action);
Serial.println("Crash apres action");
}
}
Le crash se passe aléatoirement après connectionToDevice quand on exécute ( et uniquement ) actionListener.
J'obtiens en effet dans la console soit :
-Crash apr (puis tout des chiffres bizarres)
- On est dan ( et tout des chiffres bizarres encore...)
Que peut-il bien se passer ?
Si mes explications ne sont pas claires, n'hésitez surtout pas à me demander des informations :).
Merci à tous