# \[RESOLUE\] Aide sur bug de programme

**URL:** <https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742>\
**Category:** Français\
**Created:** [September 4, 2018, 6:29pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742 "2018-09-04T18:29:59Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Jeremk](https://avatars.discourse-cdn.com/v4/letter/j/ba8739/32.png) [@Jeremk](https://forum.arduino.cc/u/Jeremk)\
**Post date:** [September 4, 2018, 6:29pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/1 "2018-09-04T18:29:59Z")

</div>

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](https://www.amazon.fr/gp/product/B07F6ZCB3J/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)

[Shield GSM](https://www.amazon.fr/gp/product/B07B2G3YFB/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1)

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 😃

Merci d'avance  
Jerem

```cpp
#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;
  }
}

```

---

<div class="post-metadata">

**Author:** ![lesept](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lesept/32/238959_2.png) [@lesept](https://forum.arduino.cc/u/lesept)\
**Post date:** [September 4, 2018, 6:36pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/2 "2018-09-04T18:36:10Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Jeremk](https://avatars.discourse-cdn.com/v4/letter/j/ba8739/32.png) [@Jeremk](https://forum.arduino.cc/u/Jeremk)\
**Post date:** [September 4, 2018, 6:41pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/3 "2018-09-04T18:41:04Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![lesept](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lesept/32/238959_2.png) [@lesept](https://forum.arduino.cc/u/lesept)\
**Post date:** [September 4, 2018, 9:02pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/4 "2018-09-04T21:02:48Z")

</div>

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

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

```

et l'appeler avec

```cpp
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

---

<div class="post-metadata">

**Author:** ![Jeremk](https://avatars.discourse-cdn.com/v4/letter/j/ba8739/32.png) [@Jeremk](https://forum.arduino.cc/u/Jeremk)\
**Post date:** [September 5, 2018, 5:57pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/5 "2018-09-05T17:57:38Z")

</div>

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

```cpp
#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](https://www.gotronic.fr/pj2-guide-de-mise-en-marche-du-module-bluetooth-hc-1546.pdf)

Aprés le reste viens de moi.

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

```cpp
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 --'.

---

<div class="post-metadata">

**Author:** ![lesept](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lesept/32/238959_2.png) [@lesept](https://forum.arduino.cc/u/lesept)\
**Post date:** [September 5, 2018, 6:48pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/6 "2018-09-05T18:48:35Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Jeremk](https://avatars.discourse-cdn.com/v4/letter/j/ba8739/32.png) [@Jeremk](https://forum.arduino.cc/u/Jeremk)\
**Post date:** [September 5, 2018, 7:48pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/7 "2018-09-05T19:48:46Z")

</div>

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](https://www.youtube.com/watch?v=T2U4zffcfoc)

Comme la qualité et pas terrible voila 2 screen.

 ![](https://europe1.discourse-cdn.com/arduino/original/4X/c/7/6/c7688dfa78ec9f3bc348115d1a06afe600a1dec3.jpeg)

 ![](https://europe1.discourse-cdn.com/arduino/original/4X/1/1/8/118b77c8f42f6044c776d30c38b7fbf2a921a9de.jpeg)

---

<div class="post-metadata">

**Author:** ![lesept](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lesept/32/238959_2.png) [@lesept](https://forum.arduino.cc/u/lesept)\
**Post date:** [September 5, 2018, 8:16pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/8 "2018-09-05T20:16:43Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Jeremk](https://avatars.discourse-cdn.com/v4/letter/j/ba8739/32.png) [@Jeremk](https://forum.arduino.cc/u/Jeremk)\
**Post date:** [September 5, 2018, 9:39pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/9 "2018-09-05T21:39:09Z")

</div>

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

 ![](https://europe1.discourse-cdn.com/arduino/original/4X/6/6/1/66154f3ea0036e256b012d627d3ef32d573dbf34.jpeg)

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:

```cpp
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, ...

---

<div class="post-metadata">

**Author:** ![lesept](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lesept/32/238959_2.png) [@lesept](https://forum.arduino.cc/u/lesept)\
**Post date:** [September 5, 2018, 9:50pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/10 "2018-09-05T21:50:22Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![Jeremk](https://avatars.discourse-cdn.com/v4/letter/j/ba8739/32.png) [@Jeremk](https://forum.arduino.cc/u/Jeremk)\
**Post date:** [September 5, 2018, 10:07pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/11 "2018-09-05T22:07:44Z")

</div>

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. 😠 😠 la je suis a court d'idée.

---

<div class="post-metadata">

**Author:** ![dakota99](https://avatars.discourse-cdn.com/v4/letter/d/76d3ee/32.png) [@dakota99](https://forum.arduino.cc/u/dakota99)\
**Post date:** [September 6, 2018, 6:04am UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/12 "2018-09-06T06:04:28Z")

</div>

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);  
}

---

<div class="post-metadata">

**Author:** ![lesept](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lesept/32/238959_2.png) [@lesept](https://forum.arduino.cc/u/lesept)\
**Post date:** [September 6, 2018, 9:42am UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/13 "2018-09-06T09:42:30Z")

</div>

> 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. 😠 😠 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é :

```arduino
  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 :

```arduino
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

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

```

---

<div class="post-metadata">

**Author:** ![Jeremk](https://avatars.discourse-cdn.com/v4/letter/j/ba8739/32.png) [@Jeremk](https://forum.arduino.cc/u/Jeremk)\
**Post date:** [September 6, 2018, 10:41am UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/14 "2018-09-06T10:41:31Z")

</div>

> 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.

 ![](https://europe1.discourse-cdn.com/arduino/original/4X/3/f/1/3f19f85e06c49d45abb9d83f0ecfb81675a52e18.png)

 ![](https://europe1.discourse-cdn.com/arduino/original/4X/d/4/c/d4c736a6fa9a2ffc406fa8ff3f32c947adb0d4b6.png)

---

<div class="post-metadata">

**Author:** ![lesept](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lesept/32/238959_2.png) [@lesept](https://forum.arduino.cc/u/lesept)\
**Post date:** [September 6, 2018, 1:11pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/15 "2018-09-06T13:11:41Z")

</div>

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

Tes lignes :

```cpp
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 ?

---

<div class="post-metadata">

**Author:** ![Jeremk](https://avatars.discourse-cdn.com/v4/letter/j/ba8739/32.png) [@Jeremk](https://forum.arduino.cc/u/Jeremk)\
**Post date:** [September 6, 2018, 10:22pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/16 "2018-09-06T22:22:03Z")

</div>

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

```arduino
#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.

---

<div class="post-metadata">

**Author:** ![lesept](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lesept/32/238959_2.png) [@lesept](https://forum.arduino.cc/u/lesept)\
**Post date:** [September 7, 2018, 8:29am UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/17 "2018-09-07T08:29:42Z")

</div>

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 :

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

```

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

---

<div class="post-metadata">

**Author:** ![Jeremk](https://avatars.discourse-cdn.com/v4/letter/j/ba8739/32.png) [@Jeremk](https://forum.arduino.cc/u/Jeremk)\
**Post date:** [September 7, 2018, 11:59am UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/18 "2018-09-07T11:59:25Z")

</div>

C'est fait :

```cpp
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.

---

<div class="post-metadata">

**Author:** ![lesept](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lesept/32/238959_2.png) [@lesept](https://forum.arduino.cc/u/lesept)\
**Post date:** [September 7, 2018, 12:19pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/19 "2018-09-07T12:19:39Z")

</div>

Une autre possibilité pourrait venir de l'utilisation de String dans ton code. Comme le dit J-M-L dans son [tuto](https://forum.arduino.cc/index.php?topic=500683.0), "_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()

---

<div class="post-metadata">

**Author:** ![Jeremk](https://avatars.discourse-cdn.com/v4/letter/j/ba8739/32.png) [@Jeremk](https://forum.arduino.cc/u/Jeremk)\
**Post date:** [September 7, 2018, 5:25pm UTC](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742/20 "2018-09-07T17:25:13Z")

</div>

> lesept:  
> Une autre possibilité pourrait venir de l'utilisation de String dans ton code. Comme le dit J-M-L dans son [tuto](https://forum.arduino.cc/index.php?topic=500683.0), "_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 😉

Ce sera pas tout de suite, tout de suite c'est vacance 🙂

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

```arduino
#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;
  }
}

```

[Next page](https://forum.arduino.cc/t/resolue-aide-sur-bug-de-programme/544742.md?page=2)
