vider une chaine de caractère

Vider une chaine de caractère.

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

 if(Serial.available() >= 5) {
    char recept[5];
    Serial.readBytes(recept, 5);

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.

char recept[5] = "";
char recept[] = "0";
char recept[] = "";
Serial.flush();

Si vous avez une solution je suis preneur, merci beaucoup.
Sébastien.

Bonjour,

Que veux-tu faire au juste ?

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.

Bonjour, essai ça =

for (int i=0; i<6;i++)
    {recept[i]=NULL;}

Il faut mettre "i < 5", car la capacité est de 5 caractères, pas 6.

ou encorememset(receipt, 0, 5) :wink:

ok merci pour vos réponses, je fais les tests cet apres midi et je vous dis.
Merci

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

mais idem.

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.

Si flush() ne fonctionne plus comment on fait?

Normalement pour la réception on utilise Serial.Read() qui dès qu'on lit un caractère l'efface du buffer. Normalement on a jamais à vider le buffer.

En général on utilise une routine du genre :

if(Serial.available()) {

delay(20);

char Buffer[20];
int i=0;

while(Serial.available()) Buffer[i++] = Serial.Read();

//traitement de Buffer

 }

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?

ça marche!!! avec:

while (Serial.available()){
    Serial.read();
}

Merci, en faite c'était donc bien le buffer qui se chargeait et donc ça roule merci.

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.