[RESOLUE] Aide sur bug de programme

Bonjour,
Je viens demander un peu d’aide car j’ai un gros problème avec mon code et je m’en sort pas.

Je souhaite mettre en place une commande de porte de garage par SMS, avec un Shield GSM, un Shield avec 4 relais, et un Arduino Uno.

Shield Relais

Shield GSM

Pour le moment j’essaie uniquement de recevoir un message, de récupérer les informations qui m’intéresse et de les afficher dans le moniteur série.

J’ai fait plusieurs code, un peu différent mais a chaque fois j’ai le même problème. Je créer mon code étape par étape, puis au bout d’un certain temps, les premières étape qui était fonctionnait bien, ne marche plus.

En gros je commence par récupérer ce que m’envoie le Shield GSM, je découpe le message par ligne, puis par info, je met ces infos dans des variables string, je supprime le message, puis je traite les infos.

Pour le moment mon code fonctionne parfaitement jusqu’à mon étape 4.
Puis si j’enlève les balises de commentaire sur l’étape 410, ma fonctions Format ne marche plus.

Je comprend vraiment pas pourquoi. Si vous avez une solution ce serait génial :smiley:

Merci d’avance
Jerem

#include <SoftwareSerial.h>
#define rxPin 7
#define txPin 8

SoftwareSerial gsm(rxPin, txPin);

String Commande = "";
String Numero = "";
String Date= "";
String Message= "";
String Heure= "";

int Etape = 0;

void setup()
{
 pinMode(rxPin, INPUT);
 pinMode(txPin, OUTPUT);
 gsm.begin(9600);
 Serial.begin(9600);
}

void loop()
{
  
  Exe();
  
  if(gsm.available())
  {
    int i = 0;
    char someChar[257] = {0};
    do{
      someChar[i++] = gsm.read();
      delay(3);
      }
      while (gsm.available() > 0);
      if(Etape == 100){Serial.println(someChar);}
      Format(someChar,i);
      Etape++;
  }
  if(Serial.available())
  {
    int i = 0;
    char someChar[32] = {0};
    do{
      someChar[i++] = Serial.read();
      delay(3);
      }
    while (Serial.available() > 0);
    gsm.println(someChar);
    Etape = 100;
    }
}

void Format(char MsgF[257],int T)
{
  
  int L=0;
  int c=0; 
  char Ligne[6][64] = {{0},{0}};
  char Info[7][32] = {{0},{0}};
    
  for(int i=0;i<=T;i++)
  {
    if (MsgF[i]== '\n')
    {
      L++;
      c=0;
    }
    else
    {
      Ligne[L][c]= MsgF[i];
      c++;
    }
  }
  
  L=0;
  c=0;

  for (int i=0;i<64;i++)
  {
    if (Ligne[1][i]== ',')
    {
      L++;
      c=0;
    }
    else if (Ligne[1][i]!='"')
    {
      Info[L][c]=Ligne[1][i];
      c++;
    }
  }


  Commande = "";  
  Commande = String(Info[0]);
  
  if(Commande == "+CMGL: 1")
  { 
    Numero = "";
    Date= "";
    Message= "";
    Heure= "";
  
    Numero = String(Info[2]);
    Date= String(Info[4]);
    Message= String(Ligne[2]);
    Heure= String(Info[5]);
  }

  else if(Info[0][0] == 'O' and Info[0][1] == 'K')
  {
    Commande = "OK";
  }
  else if(Info[0][0] == '+' and Info[0][1] == 'C' and Info[0][2] == 'M' and Info[0][3] == 'G' and Info[0][4] == 'S' and Info[0][5] == ':')
  {
    Commande = "+CMGS:";
  }
  //Serial.print("Commande =");Serial.println(Commande);
  //delay(100);
}

void Exe()
{
  switch(Etape)
  {
    case 0:
    //Serial.println("Attente");
    delay(500);
    break;

    case 1:
    if(Commande=="+CMTI: SM"){Serial.println("Message Recue");gsm.print("AT+CMGL= \"ALL\"\r");delay(100);}
    else {Serial.println("Erreur 1");Etape = 0;}
    break;

    case 2:
    if(Commande=="+CMGL: 1")
    {
      Serial.print("Message =");Serial.println(Message);
      Serial.print("Numero =");Serial.println(Numero);
      Serial.print("Date =");Serial.println(Date);
      Serial.print("Heure =");Serial.println(Heure);
      delay(100);
    }
    else {Serial.println("Erreur Lecture MSG");}
    
    gsm.print("AT+CMGD=1\r");
    delay(100);
    break;

    case 3:
    if(Commande == "OK") {Serial.println("Message Supprimé OK");Etape = 4;}    
    else {Serial.println("Erreur Suppression MSG");Etape = 0;}
    delay(100);
    break;

    case 4:
    if(Message == "LED:ON\r"){Serial.println("Demande Allumage Led)"); Etape= 0;}
    else if(Message == "LED:OFF\r"){Serial.println("Demande Arret Led)"); Etape= 0;}
    else if(Message == "Porte\r"){Serial.println("Demande Ouverture Porte"); Etape= 0;}
    else {Serial.println("Aucune commande connue");Etape = 0;}
    delay(100);
    break;
/*
    case 410:
    if(Numero == "+33xxxxxxxx"){Serial.println("Commande Autorise, telephone de Jeremy"); Etape= 0;}
    else {Serial.println("Utilisateur inconnue");Etape = 0;}
    delay(100);
    break;

    case 411:
    Serial.println("Porte Ouverte OK"); Etape= 0;
    delay(100);
    break;*/

    case 100:
    Serial.println("Commande Manu");
    delay(100);
    break;

    case 101:
    if(Commande == "OK") {Serial.println("Commande Manu OK");} else {Serial.println("Erreur");}Etape = 0;
    break;
  }
}

Jeremy, tu ne devrais pas mettre ton numéro de portable en ligne sur un forum...

Merci j'avais complètement oublier de l'enlever --'

Ton code est complexe, il faudrait qu'on sache si tu as tout écrit toi même ou si tu as pris des morceaux sur internet. Si oui lesquels et où afin qu'on sache s'il faut s'y fier ou non...

Je pense que ton problème vient de la définition de ta fonction Format qui reçoit un tableau en entrée. Je ne suis pas très fort sur les pointeurs mais je pense qu'il faudrait la définir plutôt comme suit

void Format(char *MsgF, int size,int T)

et l'appeler avec

Format(someChar,257, i);

Tu n'as peut être même pas besoin de la taille dans ta fonction, je crois que tu ne l'utilises pas

Alors j’ai repris une petite partie d’un code sur internet, que j’ai adapté. Voila l’original :

#include <SoftwareSerial.h>
#define rxPin 11 // Broche 11 en tant que RX, à raccorder sur TX du HC-05
#define txPin 10 // Broche 10 en tant que TX, à raccorder sur RX du HC-05
SoftwareSerial mySerial(rxPin, txPin);
void setup()
{
 // define pin modes for tx, rx pins:
 pinMode(rxPin, INPUT);
 pinMode(txPin, OUTPUT);
 mySerial.begin(38400);
 Serial.begin(38400);
}
void loop()
{
int i = 0;
char someChar[32] = {0};
// when characters arrive over the serial port...
if(Serial.available()) {
 do{
 someChar[i++] = Serial.read();
 delay(3);
 }while (Serial.available() > 0);
 mySerial.println(someChar);
 Serial.println(someChar);
}
while(mySerial.available())
 Serial.print((char)mySerial.read());
}

ICI

Aprés le reste viens de moi.

Je viens de faire un essaie en modifiant ma définition de variable :

void Format(char *MsgF,int T)

mais sa marche toujours pas. Quand j’enlève de commentaire les étapes 410 et 411 même sans les appeler, ça plante --’.

Explique exactement ce que tu veux dire par "ça plante". Que se passe t-il ? L'arduino prend feu ?

Alors avec les etapes 410 411 en commentaire, je récupère correctement mes infos (Message, Date, Heure, Numero, Commande) puis le fait d'enlever ces étapes des commentaire je ne récupére plus mes infos correctement, certaine ne passe pas. Dans l'exemple l'heure n'est pas passer mais il peu aussi y avoir les autres infos de façons aléatoire.

J'ai fait une petite vidéo si sa peu aider. ICI

Comme la qualité et pas terrible voila 2 screen.

|500x280

|500x281

Et c'est à quelle étape que tu devrais avoir l'heure et qu'elle ne passe pas ?

Voila les échanges brut du module gsm lors de réception de sms.

|500x281

Je suis a l'étape 0:

Tout seul le module gsm m'envoie " +CMTI: "SM",1 " pour me dire qu'il a reçue un sms

je rentre dans ma fonction format(), et je dit que ma variable "Commande=+CMTI: SM"

je sort de ma fonctions format(), je passe a l'étape 1 et je rentre dans ma fonction exe()

Je vérifie que j'ai bien ma variable "Commande=+CMTI: SM" si ok je demande la lecture du sms a mon module en lui envoyant la commande "AT+CMGL= "ALL" "

Le module me répond avec cette trame:

AT+CMGL= "ALL"


+CMGL: 1,"REC UNREAD","+336XXXXXXXX","","18/09/05,23:07:14+08"
Salut 

OK

Je rentre dans ma fonction format()

Je sépare les lignes et je récupère les infos du sms qui ce trouve ligne 1. Ce qui me donne:

Ligne 0 : AT+CMGL= "ALL" Ligne 1 : +CMGL: 1,"REC UNREAD","+336XXXXXXXX","","18/09/05,23:07:14+08" Ligne 2 : Salut Ligne 3 : OK

Info 0 :+CMGL: 1 Info 1 :REC UNREAD Info 2 :+336XXXXXXXX Info 3 : Info 4 :18/09/05 Info 5 :23:07:14+08

Je dit que "Commande = Info 0 "et que si "Commande =+CMGL: 1" alors Numéro = Info 2 Date = Info 4 Heure = Info 5 Message = Ligne 2

Voila c'est ici que je récupère mes valeurs et c'est ici que sa plante, je comprend vraiment pas pourquoi.

Je sort de Format(), je passe a l'étape 2, je rentre dans exe(), j'affiche dans le serial ce que je veux puis je demande la suppression du sms, ...

J'y comprends rien. Tu fais une sorte de traitement de texte pour extraire des infos, mais il doit y avoir plus simple avec des fonctions natives du langage C.

C'est possible qu'il y est des façons plus simple, mais ce que je n'explique pas, c'est pourquoi ma fonction fonctionne parfaitement puis sans la modifier, en ajoutant du code dans une autre fonction que l'on exécute même pas , elle marche plus. :angry: :angry: la je suis a court d'idée.

Bonjour,
J’ai fait un projet similaire qui tourne depuis plusieurs années pour l’ouverture d’une barrière.
Voici un extrait au niveau de la réception et du traitement du sms.
Je ne suis pas un expert donc c’est probablement perfectible mais ça fonctionne.
J’envoie un sms “bar” pour actionner l’ouverture de la barrière : relais se ferme et actionne un télécommande 433 Mhz. Puis x secondes plus tard le relais se ferme à nouveau pour bloquer la barrière.

#include <RCSwitch.h>
#include <GSM.h> // include the GSM library

RCSwitch mySwitch = RCSwitch();
#define PINNUMBER “XXXX” // PIN Number for the SIM XXX

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

char senderNumber[20]; // Array to hold the number a SMS is retreived from

const int pbuz = 9; // buzzer
const int prel = 10; // relais télécommande
String readString; // create readString class

unsigned long tob = 40000; // temps ouverture barrière
unsigned long t1;
int etr1 = 0; // 1 = barrière en train de s’ouvrir

void setup() {
pinMode(pbuz,OUTPUT); // buzzer
pinMode(prel,OUTPUT); // buzzer
mySwitch.enableTransmit(8); // TX connected to Pin #7
// initialize serial communications and wait for port to open:
Serial.begin(9600);
Serial.println(“Start setup”);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}

Serial.println(“SMS Messages Receiver”);
buz01(1);
// connection state
boolean notConnected = true;

// Start GSM connection
while (notConnected) {
if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
notConnected = false;
} else {
Serial.println(“Not connected”);
buz01(6);
delay(1000);
}
}

Serial.println(“GSM initialized”);
Serial.println(“Waiting for messages”);
etr1 = 0;
buz01(2);
}

void loop() {
char c;
//===================================================================
if((etr1 == 1) and (millis() - t1) > 40000)
{rel2(); // bloquer barrière en position ouverte
etr1 = 0;
}

//===================================================================
if (sms.available()) {
String readString = “”;
Serial.println(“Message received from:”);

// Get remote number
sms.remoteNumber(senderNumber, 20);
Serial.println(senderNumber);
// Any messages starting with # should be discarded
if (sms.peek() == ‘#’) {
Serial.println(“Discarded SMS”);
sms.flush();
}

while (c = sms.read()) {
Serial.print(c);
readString += c; //store characters to string
}

else if ((readString == “mvb”))
{ voup(); // descendre volet buanderie
}
else if ((readString == “bar”))
{t1 = millis(); // enregistrement temps
rel1(); // ouvrir barrière
etr1 = 1;
}

else if ((readString == “br1”))
{rel3(); // impulsion barrière pour ouvrir bloquer ou fermer
}

Serial.println("\nEND OF MESSAGE");

sms.flush(); // Delete message from modem memory
Serial.println(“MESSAGE DELETED”);
}
delay(1000);
}

Jeremk:
C’est possible qu’il y est des façons plus simple, mais ce que je n’explique pas, c’est pourquoi ma fonction fonctionne parfaitement puis sans la modifier, en ajoutant du code dans une autre fonction que l’on exécute même pas , elle marche plus. :angry: :angry: la je suis a court d’idée.

Ton code a l’air correct. La seule chose que je voie est que tu déclares dans la loop deux fois ton tableau SomeChar avec des dimensions différentes. Comme ces déclarations sont dans des blocs différents, ça ne devrait pas poser de problème (si la portée des variables est limitée au bloc où elles sont déclarées).

Mais si ce n’est pas le cas, tu devrais changer le nom du second tableau pour éviter toute ambiguité :

  if (Serial.available())
  {
    int i = 0;
    char someChar2[32] = {0};
    do {
      someChar2[i++] = Serial.read();
      delay(3);
    }
    while (Serial.available() > 0);
    gsm.println(someChar2);
    Etape = 100;
  }

Un autre truc :

someChar[i++] = gsm.read();
...
someChar2[i++] = Serial.read();

Tu ne vérifies jamais que i ne dépasse pas la dimension maximale du tableau : il peut y avoir dépassement. Es-tu sûr que le ‘++’ est exécuté après l’affectation dans le tableau ? Il vaudrait mieux assurer en faisant

    do {
      someChar[i] = gsm.read();
      if (i<256) i++; // ou 31
      delay(3);
    }
    while (gsm.available() > 0);

dakota99: Bonjour, J'ai fait un projet similaire qui tourne depuis plusieurs années pour l'ouverture d'une barrière.

Merci mais tu utilise la lib GSM.H, Je voulais pas m'en servir, de plus elle est faite pour une com serie sur les PIN 3 et 4. Mon shield lui fonctionne sur les PIN 7 et 8. Bon il doit bien y avoir moyens de modifier les PIN de COM mais la ce que je souhaite comprendre c'est les raisons du bug de mon programme, pour pouvoir avancer et ne pas ce retrouver bloqué a nouveau dans le futur sur un problème similaire.

lesept: Ton code a l'air correct. La seule chose que je voie est que tu déclares dans la loop deux fois ton tableau SomeChar avec des dimensions différentes. Comme ces déclarations sont dans des blocs différents, ça ne devrait pas poser de problème (si la portée des variables est limitée au bloc où elles sont déclarées).

Oui normalement la portée est limitée au bloc, mais bon j'ai quand même suivie tes conseils, est j'ai bien effectuée les modifications, mais j'ai toujours pas d'amélioration.

Par contre j'ai remarqué un certain rapport avec entre la quantités de code et le nombre de variable vide.

Voici 2 screens pour illustrés. Sur le premiers, j'ai enlevé de commentaire les étapes 410 411. Mon programme fonctionne sauf pour la remonté de la date et de l'heure.

Dans le 2eme la seul et unique modification c'est que j'ai mis en commentaire la ligne qui m'affiche mon numéro. Et dans ce cas j'ai bien la date qui s'affiche.

|500x281

|500x282

Quand tu dis que tu as fais les modifications : même celle de limiter i à la taille du tableau ?

Tes lignes :

while (gsm.available() > 0);
...
while (Serial.available() > 0);

Sont-elles bien ce que tu veux faire ? Mettre un ; juste après un while, c’est équivalent à ne rien faire pendant que la condition est vraie. Donc là, tu attends qu’il n’y ait plus rien qui arrive dans la liaison gsm ou série pour passer à la suite. Est-ce correct ?

Oui j’ai bien limité i à la taille du tableau. Voici le code que j’ai actuellement:

#include <SoftwareSerial.h>
#define rxPin 7
#define txPin 8

SoftwareSerial gsm(rxPin, txPin);

String Commande = "";
String Numero = "";
String Date= "";
String Message= "";
String Heure= "";

int Etape = 0;

void setup()
{
 pinMode(rxPin, INPUT);
 pinMode(txPin, OUTPUT);
 gsm.begin(9600);
 Serial.begin(9600);
}

void loop()
{
  
  Exe();
  
  if(gsm.available())
  {
    int i = 0;
    char someChar[257] = {0};
    do{
      someChar[i] = gsm.read();
      if (i<256){i++;}
      delay(3);
      }
      while (gsm.available() > 0);
      if(Etape == 100){Serial.println(someChar);}
      Format(someChar,i);
      Etape++;
  }
  if(Serial.available())
  {
    int i = 0;
    char someChar2[32] = {0};
    do{
      someChar2[i] = Serial.read();
      if (i<31){i++;}
      delay(3);
      }
    while (Serial.available() > 0);
    gsm.println(someChar2);
    Etape = 100;
    }
}

void Format(char *MsgF,int T)
{
  
  int L=0;
  int c=0; 
  char Ligne[6][64] = {{0},{0}};
  char Info[7][32] = {{0},{0}};
    
  for(int i=0;i<=T;i++)
  {
    if (MsgF[i]== '\n')
    {
      L++;
      c=0;
    }
    else
    {
      Ligne[L][c]= MsgF[i];
      c++;
    }
  }
  
  L=0;
  c=0;

  for (int i=0;i<64;i++)
  {
    if (Ligne[1][i]== ',')
    {
      L++;
      c=0;
    }
    else if (Ligne[1][i]!='"')
    {
      Info[L][c]=Ligne[1][i];
      c++;
    }
  }


  Commande = "";  
  Commande = String(Info[0]);
  
  if(Commande == "+CMGL: 1")
  { 
    Numero = "";
    Date= "";
    Message= "";
    Heure= "";
    
    Numero = String(Info[2]);
    Date= String(Info[4]);
    Message= String(Ligne[2]);
    Heure= String(Info[5]);

  }

  else if(Info[0][0] == 'O' and Info[0][1] == 'K')
  {
    Commande = "OK";
  }
  else if(Info[0][0] == '+' and Info[0][1] == 'C' and Info[0][2] == 'M' and Info[0][3] == 'G' and Info[0][4] == 'S' and Info[0][5] == ':')
  {
    Commande = "+CMGS:";
  }
  //Serial.print("Commande =");Serial.println(Commande);
  //delay(100);
}

void Exe()
{
  switch(Etape)
  {
    case 0:
    //Serial.println("Attente");
    delay(500);
    break;

    case 1:
    if(Commande=="+CMTI: SM"){Serial.println("Message Recue");gsm.print("AT+CMGL= \"ALL\"\r");delay(100);}
    else {Serial.println("Erreur 1");Etape = 0;}
    break;

    case 2:
    if(Commande=="+CMGL: 1")
    {
      Serial.print("Message =");Serial.println(Message);
      //Serial.print("Numero =");Serial.println(Numero);
      Serial.print("Date =");Serial.println(Date);
      Serial.print("Heure =");Serial.println(Heure);
      delay(100);
    }
    else {Serial.println("Erreur Lecture MSG");}
    
    gsm.print("AT+CMGD=1\r");
    delay(100);
    break;

    case 3:
    if(Commande == "OK") {Serial.println("Message Supprimé OK");Etape = 4;}    
    else {Serial.println("Erreur Suppression MSG");Etape = 0;}
    delay(100);
    break;

    case 4:
    if(Message == "LED:ON\r"){Serial.println("Demande Allumage Led)"); Etape= 0;}
    else if(Message == "LED:OFF\r"){Serial.println("Demande Arret Led)"); Etape= 0;}
    else if(Message == "Porte\r"){Serial.println("Demande Ouverture Porte"); Etape= 410;}
    else {Serial.println("Aucune commande connue");Etape = 0;}
    delay(100);
    break;

    case 410:
    if(Numero == "+336XXXXXXXX"){Serial.println("Commande Autorise, telephone de Jeremy"); Etape= 411;}
    else {Serial.println("Utilisateur inconnue");Etape = 0;}
    delay(100);
    break;

    case 411:
    Serial.println("Porte Ouverte OK"); Etape= 0;
    delay(100);
    break;

    case 100:
    Serial.println("Commande Manu");
    delay(100);
    break;

    case 101:
    if(Commande == "OK") {Serial.println("Commande Manu OK");} else {Serial.println("Erreur");}Etape = 0;
    break;
  }
}

Oui la boucle do/while , c’est que j’exécute tous ce qu’il y a entre les accolades temps que la condition while est vrai :

do {programme a exécuter en boucle} while (condition de sortie de la boucle);

lesept:
Donc là, tu attends qu’il n’y ait plus rien qui arrive dans la liaison gsm ou série pour passer à la suite

Attention la liaison gsm et une liaison serie elle aussi par la librairie serial software.

En effet c’est un do / while : le problème vient peut-être de là. Si tu fais
do { instructions } while (condition);je pense que ça exécute les instructions AVANT de tester la condition. Donc, même si la condition est fausse dès le début, les instructions auront été exécutées au moins une fois.

Je ne sais pas si c’est bien ce que tu cherches. J’ai plutôt l’habitude de la structure :
while (condition) { instructions }Dans ce cas, les instructions ne sont pas exécutées si la condition est fausse au démarrage.

Donc teste en changeant ta structure :

    while (gsm.available() > 0) {
      someChar[i] = gsm.read();
      if (i<256){i++;}
      delay(3);
      }

Et la même chose avec l’autre do / while

C’est fait :

void loop()
{
  
  Exe();
  
  if(gsm.available())
  {
    int i = 0;
    char someChar[257] = {0};
    while (gsm.available() > 0)
    {
      someChar[i] = gsm.read();
      if (i<256){i++;}
      delay(3);
      }
      if(Etape == 100){Serial.println(someChar);}
      Format(someChar,i);
      Etape++;
  }
  if(Serial.available())
  {
    int i = 0;
    char someChar2[32] = {0};
    while (Serial.available() > 0)
    {
      someChar2[i] = Serial.read();
      if (i<31){i++;}
      delay(3);
      }
    gsm.println(someChar2);
    Etape = 100;
    }
}

Mais toujours pas d’amélioration.
Je pense pas que le problème vienne du loop(), j’ai vraiment l’impression que c’est liée au nombre de fois ou je demande un Serial.println();. Mais pourquoi ? c’est un grand mystère pour moi.

Une autre possibilité pourrait venir de l'utilisation de String dans ton code. Comme le dit J-M-L dans son tuto, "Cette classe n'est pas l'amie du programmeur sur petits micro-contrôleurs quand on ne comprend pas bien les notions d'allocation de mémoire dynamique".

Tu utilises des String dans la fonction Format, qui est appelée ... un certain nombre de fois. Peux-tu faire un compte du nombre de fois où cette fonction est appelée en utilisation normale ? Si ce nombre devient grand, il peut y avoir des problèmes de gestion de la mémoire (lis le tuto qui explique pourquoi) qui pourraient provoquer ce que tu constates.

Dans ce cas, il faudra réécrire les instructions de comparaison avec des c-string (tableaux de caractères) comme par exemple strcmp()

lesept:
Une autre possibilité pourrait venir de l’utilisation de String dans ton code. Comme le dit J-M-L dans son tuto, “Cette classe n’est pas l’amie du programmeur sur petits micro-contrôleurs quand on ne comprend pas bien les notions d’allocation de mémoire dynamique”.

Tu utilises des String dans la fonction Format, qui est appelée … un certain nombre de fois. Peux-tu faire un compte du nombre de fois où cette fonction est appelée en utilisation normale ? Si ce nombre devient grand, il peut y avoir des problèmes de gestion de la mémoire (lis le tuto qui explique pourquoi) qui pourraient provoquer ce que tu constates.

Dans ce cas, il faudra réécrire les instructions de comparaison avec des c-string (tableaux de caractères) comme par exemple strcmp()

J’ai l’impression que tu a trouvé le problème. Il semblerait effectivement que mon problème vienne des variables String. J’utilisé les variables String car je savais pas comparer facilement les variables Char, mais tu m’a aussi apporté la réponse.

Je laisse le sujet ouvert encore un peu puis si j’ai toujours pas de problème d’ici la fin de mon code je mettrais un gros Résolue :wink:

Ce sera pas tout de suite, tout de suite c’est vacance :slight_smile:

En attendant mon code final, voici mon code modifié :

#include <SoftwareSerial.h>
#define rxPin 7
#define txPin 8

SoftwareSerial gsm(rxPin, txPin);

char Commande[32]= {0};
char Numero[32]= {0};
char Date[32]= {0};
char Message[64]= {0};
char Heure[32]= {0};

int Etape = 0;

void setup()
{
 pinMode(rxPin, INPUT);
 pinMode(txPin, OUTPUT);
 gsm.begin(9600);
 Serial.begin(9600);
}

void loop()
{  
  Exe();

   if(gsm.available())
  {
    int i = 0;
    char someChar[257] = {0};
    while (gsm.available() > 0)
    {
      someChar[i] = gsm.read();
      if (i<256){i++;}
      delay(3);
      }
      if(Etape == 100){Serial.println(someChar);}
      Format(someChar,i);
      Etape++;
  }
  if(Serial.available())
  {
    int i = 0;
    char someChar2[32] = {0};
    while (Serial.available() > 0)
    {
      someChar2[i] = Serial.read();
      if (i<31){i++;}
      delay(3);
      }
    gsm.println(someChar2);
    Etape = 100;
    }
}

void Format(char *MsgF,int T)
{
  int L=0;
  int c=0; 
  char Ligne[6][64] = {{0},{0}};
  char Info[7][32] = {{0},{0}};
    
  for(int i=0;i<=T;i++)
  {
    if (MsgF[i]== '\n')
    {
      L++;
      c=0;
    }
    else
    {
      Ligne[L][c]= MsgF[i];
      c++;
    }
  }
  
  L=0;
  c=0;

  for (int i=0;i<64;i++)
  {
    if (Ligne[1][i]== ',')
    {
      L++;
      c=0;
    }
    else if (Ligne[1][i]!='"')
    {
      Info[L][c]=Ligne[1][i];
      c++;
    }
  }
  
  for(int i=0; i<32;i++){Commande[i]=0;}
  for(int i=0; i<32;i++){Commande[i]=Info[0][i];}
  
  if(strcmp(Commande, "+CMGL: 1") == 0)
  { 
    for(int i=0;i<32;i++){Numero[i]=0;Date[i]=0;Heure[i]=0;}
    for(int i=0;i<64;i++){Message[i]=0;}

    for(int i=0;i<32;i++){Numero[i]= Info[2][i];Date[i]=Info[4][i];Heure[i]=Info[5][i];}
    for(int i=0;i<64;i++){Message[i]= Ligne[2][i];}
  }
}

void Exe()
{
  switch(Etape)
  {
    case 0:
    //Serial.println("Attente");
    delay(500);
    break;

    case 1:
    if(strcmp(Commande, "+CMTI: SM") == 0){Serial.println("Message Recue");gsm.print("AT+CMGL= \"ALL\"\r");delay(100);}
    else {Serial.println("Erreur 1");Etape = 0;}
    break;

    case 2:
    if(strcmp(Commande, "+CMGL: 1") == 0)
    {
      Serial.print("Message =");Serial.println(Message);
      Serial.print("Numero =");Serial.println(Numero);
      Serial.print("Date =");Serial.println(Date);
      Serial.print("Heure =");Serial.println(Heure);
      delay(100);
    }
    else {Serial.println("Erreur Lecture MSG");}
    
    gsm.print("AT+CMGD=1\r");
    delay(100);
    break;

    case 3:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Message Supprimé OK");Etape = 4;}    
    else {Serial.println("Erreur Suppression MSG");Etape = 0;}
    delay(100);
    break;
    
    case 4:
    if(strcmp(Message, "LED:ON\r") == 0){Serial.println("Demande Allumage Led)"); Etape= 0;}
    else if(strcmp(Message, "LED:OFF\r") == 0){Serial.println("Demande Arret Led)"); Etape= 0;}
    else if(strcmp(Message, "Porte\r") == 0){Serial.println("Demande Ouverture Porte"); Etape= 410;}
    else {Serial.println("Aucune commande connue");Etape = 0;}
    delay(100);
    break;

    case 410:
    if(strcmp(Numero, "+336XXXXXXXX") == 0){Serial.println("Commande Autorise, telephone de Jeremy"); Etape= 411;}
    else {Serial.println("Utilisateur inconnue");Etape = 0;}
    delay(100);
    break;

    case 411:
    Serial.println("Porte Ouverte OK"); Etape= 0;
    delay(100);
    break;

    case 100:
    Serial.println("Commande Manu");
    delay(100);
    break;

    case 101:
    if(strcmp(Commande, "OK\r") == 0) {Serial.println("Commande Manu OK");} else {Serial.println("Erreur");}Etape = 0;
    break;
  }
}