Serial se Bloque au bout d'un moment

Bonjour à tous,
Donc j'ai fait un programme et je m'aperçois que serial se bloque au bout de plusieurs cycle.

String inputString = "";         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete

void setup() {
  // initialize serial:
  Serial.begin(57600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
  //============================
  Serial.flush();Serial.read();
  //============================
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial.println(inputString);
    //============================
    Serial.flush();Serial.read();
    //============================
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
  delay(100);
}

/*
  SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs, so using delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete = true;
      //============================
      Serial.flush();Serial.read();
      //============================
    }
  }
}

J'ai pris pour exemple le programme exemple serial event.

J'ai lu que flush() permettait de vider le tampon sortant et read() pour le tampon rentrant.
Mais j'ai l'impression que rien de fonctionne.

Comment puis je régler ce pb?
Merci d'avance
Stéphane

Il ne faut pas mettre un delay() dans loop si tu utilises serialEvent().
En effet serialEvent() est appelé à chaque itération de loop(). Si tu places un delay(), serialEvent() n'est pas actif pendant tout ce temps là et les caractères continuent à arriver dans le tampon de réception.

Serial.read() ne vide pas le tampon de réception, il ne lit qu'un caractère à la fois.
Serial.flush() lui vide bien le tampon d'émission, mais attention l'émission est asynchrone du déroulement du programme car il se déroule sous interruption. Lorsque tu fais ton Serial.println(inputString); tu peux très bien être revenu dans loop() alors que le printf n'est pas terminé (il reste des caractères à envoyer) si tu reçois à ce moment là une fin de ligne tu vas vider ton buffer d'émission avant d'avoir envoyé tous le contenu du buffer.
A l'inverse si ton buffer d'émission se vide moins vite qu'il ne se remplit ton programme peut se bloquer car la routine de réception bloque le programme jusqu'à ce qu'une place se libère dans le tampon de réception. C'est peut-être ce qui se produit avec ton delay(100).

Merci je regarde et je te redis.

Comment faire pour savoir si les buffer des ports sont plein et donc voi pour les vider.
As tu un exemple?

Bon j'ai réglé le pb, je ne fais qu'envoyé des données et cela fonctionne très bien.
J'ai éffacer toutes les réponses de la cartes suite au envoi des données.
Merci encore
Stéphane

harold44:
Comment faire pour savoir si les buffer des ports sont plein et donc voi pour les vider.
As tu un exemple?

Serial.available() retourne le nombre de caractères dans le buffer de réception.
Pour le buffer d'émission il y Serial.availableForWrite()
Tout est là Serial - Arduino Reference

@Fdufnews

Serial.flush() lui vide bien le tampon d'émission, mais attention l'émission est asynchrone du déroulement du programme car il se déroule sous interruption. Lorsque tu fais ton Serial.println(inputString); tu peux très bien être revenu dans loop() alors que le printf n'est pas terminé (il reste des caractères à envoyer) si tu reçois à ce moment là une fin de ligne tu vas vider ton buffer d'émission avant d'avoir envoyé tous le contenu du buffer

==> flush() va juste attendre que le buffer d'émission se soit vidé, que tout ait été envoyé. Il n'enlève pas ce qui n'a pas été envoyé du buffer