Problème liaison série!

Bonjour à tous! Je suis en terminale SI et je réalise en ce moment la maquette de mon projet et j'utilise un arduino uno comme microcontoleur.

Et depuis un moment j'ai un problème que je n'arrive pas à résoudre..
En effet j'ai un problème avec le Serial.read(),
dès lors que je met dans mon programme cette fonction la valeur de Serial.available passe à 1 même si j'ai envoyé plusieurs caractère sur la voie série..
Est ce normal?

Ca retourne normalement le nombre d'octets envoyés.
Quel est le code utilisé ?

Il faut être conscient que les caractère arrivent relativement lentement par rapport au temps d'exécution du code.
Si on prend l'exemple basique d'une boucle qui teste la présence de caractères avec available() et qui les lit dès qu'available() retourne différent de zéro.
L'exécution de la boucle de test va être de l'ordre de la centaine de µs alors que le rythme d'arrivé des caractères va être de lordre de la milliseconde.

Voila mon code mon problème se situe dans ma loop. Comme vous pouvez le voir les touches D et R servent à appeler des sous-programmes.. Ce que je souhaiterai faire c'est que si jamais l'utilisateur envoie d'autre caractères ou chaine de caractére que le programme puisse avertir l'utilisateur de sa fausse manipulation par exemple "vous avez écrit..." "afficher les instructions de commandes" et vider le buffer de réception!

void loop()
{

  parole = Serial.available();

  if (parole > 0)
  {
    Serial.println("depart");  
    bouton_depart = Serial.read();

      if (bouton_depart == 'd' )
      {
            Serial.println ("Vous avez appuyez sur la touche 'D' le programme va demarrer dans 1 seconde");
            Serial.println("  ");
      
            depart();

       }


       else if (bouton_depart == 'r')
             {
                  retour();
      
             }

             else  
             {
                  Serial.println(parole);
                  Serial.print("Vous avez ecrit : ");
                  
                  Serial.println(parole);
                  while (parole > 0)
                  {
                      
                      Serial.print("while");
                      Serial.print(bouton_depart);
                      bouton_depart=Serial.read();
                      parole = Serial.available();
                      
                  }
                  

             }
    
  }
}

voua avez le code complet en PJ :wink:

programme_final.ino (4.24 KB)

J'ai trouvé une piste... J'ai mis un serial.print(parole) juste après l'entrée dans le if et j'ai remarqué que le serial available était toujours égale à 1 meme si j'envoie plusieurs caractères sur le port!

J'ai refait un tout petit programme m'indiquant juste la valeur available et cette fois si il m'affiche bien le nombre de caractères que j'ai envoyé!!

Il y a donc selon moi un probleme... j'ai isolé toutes les fonctions et selon moi ce serait la fonction read qui ferait passé available à 1 meme si read n'est executer que après avoir demander la valeur de available!!

Est ce que quelqu'un a deja eu ce problème??? je suis un peu meme beaucoup perdu...

En fait on ne comprends pas ton problème.
Tu ne reçois pas tous les caractères que tu envoies?
Si les caractères sont lus au rythme ou ils sont envoyés, available() reverra toujours 1 et c'est normal.

Je m'explique ce que je voudrais que mon programme fasse c'est qu'il ne fonctionne que si l'utilisateur envoie "d" ou "r" mais que lorsqu'il tape "dd" ou "rr" ou "fkjrbf" le programme lui affiche ce qu'il a marqué et qu'il lui redonne les informations de fonctionnement.

Dans le programme actuel l'orsque l'on tape "DD" la boucle depart va s'exécuter deux fois de suite! Et lorsque l'on tape par exemple "gh" sur le moniteur série va s'afficher
Vous avez écrit: g vous avez écrit:h

Alors que je voudrais qu'il écrive
Vous avez écrit: gh

En espérant avoir été un peu plus clair..

bonjour,
dans ton prog, tu ne mets pas bout à bout les caractères tapés et vérifie si un retour chariot est entré.

réception des caracteres, tant que caractere différent de retour chariot, on ajoute à chaine recue
si retour chariot détecté
tu compare la chaine recue
si la chaine = d =>depart
sinon affiche chaine recue

Excusez moi je suis novice... Qu'est ce qu'un retour chariot?
Et comment afficher la chaîne en entier??
Avec readstring?? J'ai déjà essayer mais sauf que je n'ai pas mis une bonne variable ?? Laquelle je dois mettre char??

retour chariot = retour à la ligne = touche entrée ou enter

D'accord merci de me répondre mais contrairement j'ai pas trop compris..

En fait à chaque fois qu'il y a plusieurs caractère la fonction while n'est exécuter qu'une fois puis la fonction loop redémarre!!

Il faut que tu comprennes ce qu'est un retour chariot.
Si le post de infobarquee ne te suffit pas à comprendre alors va sur le net et cherche par toi-même ce qu'est un retour chariot parce que tu ne pourras pas passer outre ce point IMPORTANT et nécessaire à la fonction que tu cherche à développer.

Je te donnes une piste, quelle est la différence "technique" entre ça :
ODIL

et ça :
O
D
I
L

Ou encore ça :
O
DI
L

tomcha:
D'accord merci de me répondre mais contrairement j'ai pas trop compris..

En fait à chaque fois qu'il y a plusieurs caractère la fonction while n'est exécuter qu'une fois puis la fonction loop redémarre!!

regardes ton clavier et trouve la touche ENTER pour aller à la ligne, tu l'utilise dans chaque post
en langage arduino, ca peut être \r ou char(13) si je ne me trompe pas

normal que ca sorte de la boucle while, tu ne lis qu'un caractère et ne stock rien.
le loop ne redémarre pas, loop = boucle

fais un serial.print(bouton_depart)
tu vas comprendre de suite

Merci pour vos réponse je vais essayer de bosser dessus!!
Et sinon j'aurai voulu savoir avec quel variable je peux utiliser un Serial.readstring ?? Et quel est la différence avec un simple read???
Encore merci