Pages: [1]   Go Down
Author Topic: vider une chaine de caractère  (Read 742 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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

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

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

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

Belgium
Offline Offline
God Member
*****
Karma: 15
Posts: 524
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Sud-Ouest
Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour, essai ça =
Code:
for (int i=0; i<6;i++)
    {recept[i]=NULL;}
« Last Edit: August 23, 2013, 03:22:03 am by cutprod » Logged

Belgium
Offline Offline
God Member
*****
Karma: 15
Posts: 524
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

ou encore
Code:
memset(receipt, 0, 5)
smiley-wink
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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





Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3755
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3755
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :

Code:

if(Serial.available()) {

delay(20);

char Buffer[20];
int i=0;

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

//traitement de Buffer

 }

Logged


France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

flush() attend que le buffer d'émission soit vide.

Pour vider le buffer de réception il faut faire:

Code:
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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ça marche!!! avec:
Code:
while (Serial.available()){
    Serial.read();
}


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

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: