bonjour
je veux lire une chaine de caractere et faire compairson , pour cela j'ai cree le code suivante
#include <stdio.h>
void setup()
{
Serial.begin(9600);
}
void loop()
{
if(Serial.available()>0 )
{
char code[4];
int i=0;
while(Serial.available()>0 && i<=4)
{
code[i]=Serial.read();
delay(10);
i++;
}
i++;
code[i]='\0';
Serial.println(code);
if( strcmp(code,"123")==0)
{ Serial.println("");
Serial.println("oui");
}
if(strcmp(code,"dack")==0)
{Serial.println("");
Serial.println("NON");
}
}
}
ce code seulement un test mais malheuresement sa marche pas :S parfois , il m'affiche @ a la fin :S et meme quand je depasse 5 caractere il affiche tous ,plus il n'affiche meme pas OUI ou NON
svp que je dois faire pour regler ce problem
salut
- remplace ton char code[4] par char code[5]
- remplace i<=4 par i<4
- supprime le deuxième i++
il me semble que cela devrait fonctionner, et si c'est bien le cas alors comprends pourquoi
et aussi : n'oublie pas que loop() boucle éternellement sur elle-même...
Un des premiers trucs à faire, c'est de rendre ton code lisible, car là, je ne m'y retrouve pas du tout :
#include <stdio.h>
void setup()
{
Serial.begin(9600);
}
void loop()
{
if(Serial.available()>0 )
{
char code[4];
int i=0;
while(Serial.available()>0 && i<=4)
{
code[i]=Serial.read();
delay(10);
i++;
}
i++;
code[i]='\0';
Serial.println(code);
if( strcmp(code,"123")==0)
{
Serial.println("");
Serial.println("oui");
}
if(strcmp(code,"dack")==0)
{
Serial.println("");
Serial.println("NON");
}
}
}
après, j'avoue que c'est très maladroit comme code. déclarer des variables en plein milieu du code est le meilleur moyen de ne pas s'y retrouver.
Ta lecture de code ne laisse pas beaucoup de possibilité pour l'émetteur. Si le code n'est pas envoyé d'un coup, tu risques d'en perdre en route. Il faut garder à l'esprit qu'une liaison série permet d'envoyer des octets quand on veut, il se peut donc qu'il y ait une pause de quelques dizaines voire centaines de ms entre deux caractères, tu ne laisses que 10ms. Je remplacerais le début par :
char code[5]; // Je déclare toujours mes variables en global, on sait jamais...
byte i; // byte au lieu d'int, car on n'a pas besoin d'un index allant de -32767 à +32767, 0 à 255 suffit.
void loop()
{
if(Serial.available()) // on a reçu quelque chose dans le serial (eg. Serial.available != 0).
{
code[0] = Serial.read(); // je récupère le premier char reçu.
i = 1;
while(i < 4)
{
while(!Serial.available()); // j'attends l'arrivée du prochain.
code[i]=Serial.read(); // je récupère celui qui vient d'arriver.
if(code[i] == '\0') break; // on a reçu une fin de chaîne, alors on sort du while()
i++;
}
code[4]='\0'; // dans le cas où le code est > 3 chiffres, on impose une fermeture de chaîne.
Serial.println(code);
...
Comme tu compares ton code à une chaîne de trois ou quattre, il faut pouvoir gérer le cas où... Essaie de comprendre mon bout de code, j'ai mis assez de commentaires dedans...
lire et buffer entree serie arret sur un caractere target et vider les caractères restants