Dans le cadre d'un dialogue entre une UNO et un autre système, je reçois et envois des chaines de caractères du type (0x01, 0xAA, 0x0F, 0x55, 0x78) toujours 5.
Je traite les chaines reçus comme ceci
Tout fonctionne bien sauf que ma chaine char recept[5] se remplit et fini par ne plus accepter de réception.
J'ai essayé de vider en vidant le buffer de la liaison série et en réaffectant la chaine sans résultat.
La définition "char receipt[5]" réserve en mémoire 5 caractères. Je ne comprends pas ce que tu veux dire par "vider", ni que que cette chaîne finit par ne plus accepter de réception.
Bon en faite j'ai testé les deux solutions et ça ne marche pas, char recept se charge de tout ce qui arrive et fini par ce remplir et ne traite plus l'info.
void loop() {
boutonstatehome = digitalRead(boutonhome);
Serial.flush();
Serial.write(statut);
Serial.write(0x00);
Serial.write(0x00);
delay(2000);
if(Serial.available() >= 5) {
char recept[5];
Serial.readBytes(recept, 5);
if
(memcmp(recept, timer , 5) == 0
|| memcmp(recept, charging ,5) ==0)
{
Serial.write(retourhome);//tjrs à la maison pendant le timer
Serial.write(0x00);
Serial.write(0x03);
digitalWrite(ledPinr, HIGH);//porte fermée
digitalWrite(ledPinv, LOW);
delay(3000);
for (int i=0; i<6;i++)
{
recept[i]=NULL;
}
}
j'ai aussi essayé avec
for (int i=0; i<5;i++)
memset(recept, 0, 5);
Le problème ne vient pas de la si tu utilises le code tel que tu l'a posté. La "redéclaration" de recept[] à chaque if doit la remettre à zéro vu qu'elle n'est pas static.
EDIT : à mon avis tu te plantes sur flush() qui ne vide plus le buffer depuis l'IDE 1.0
En faite je ne sais plus si mon problème vient de ma chaine de caractères ou de mon buffer, ce que je suis certain par contre c'est qu'au bout d'un certains nombre de réceptions, la lecture de ma chaine de caractères ne se fait plus.
Et si le récepteur envoie par erreur 10 valeurs au lieu de 5 en réponses d'une requette la réponse est traitée en deux fois 5 par 5 on garde donc bien en mémoire après chaque if idem, j'ai essayé si on envoie 10 fois une chaine de caractères à la suite on va bouclé 10 fois de suite.
flush() attend que le buffer d'émission soit vide.
Pour vider le buffer de réception il faut faire:
while (Serial.available()){
Serial.read();
}
Le problème de ton code c'est que tu ne synchronise pas la réception sur le caractère de début de trame (0x01). Du coup, si tu te décales, tu es perdu et tu ne raccroches jamais correctement sur ton message.
Pour vider une chaîne il suffit de mettre NULL ( ou 0) dans le premier élément, c'est le terminateur de chaîne.
Il n'y a ps de raisons pour que le buffer sature. Tes chaînes arrivent à quelle vitesse?
En faite j'utilise Serial.readBytes(); et non Serial.Read()
suite à une réponse que j'ai eu sur le forum afin d'extraire certaines valeurs reçus de ma chaine de caractères et les traiter et c'est la seul solution que j'avais trouvé à l'époque et comme ça marchait mise à part ce problème de saturation.
Sébastien.