Simple Affichage de caractère

Bonjour tout le monde,

J'ai juste une petite question svp,
dans ce programme je voudrai juste qu'il m'affiche les deux premiers caractères qui seront lus dans le moniteur série.
Voici donc mon programme :

int c;
int dizaine;
int unite;
int compte=0;
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0) 
  {      
         c=Serial.read();
         compte++;
         Serial.write(c); 
         if (compte==1)
         {
         dizaine=(c-48);
         Serial.println(dizaine);
         }
     }
}

Dans ce code je réussi bien à récupérer le premier caractère (la dizaine) et il me l'affiche bien mais en fait lorsque je veux récupérer le deuxième (l'unité) il ne me l'affiche pas.
Par exemple si je met if (compte==1&&compte==2) pour qu'il m'affiche le second caractère et bien il ne me l'affiche pas.
Je veux donc afficher l'unité (int unite;)

Comment afficher le second caractère de la même façon que le précédent ?

J'espère que j'ai été clair et merci de votre réponse.

Bonne journée.

Bonjour.
Premièrement, ta vatiable compte n'est jamais réinitialisé. Donc ta boucle ne marchera qu'une fois.

Ensuite le test que tu propoee n'est pas possible car ta variable compte ne peut pas valoir 1 et 2 à la fois, tu voulais peut être faire un OU plutôt qu'un ET?

Comme tu ne touche pas au timeout de la fonction Serial, ta condition if (Serial.available ()) se déclenchera une seconde après que Serial ne reçoive rien.
Ensuite utilise la fonction readByte qui te permet de stocker les données reçues dans un tableau de char. Et la fonction returne aussi le nombre de caractères reçus.
Ainsi tu peux supprimer ta variable compte qui ne sert à rien.
Puis tu boucles avec un for (int i=0; i <nombreCaracteresRecus; i++) afin de lire tout ton tableau, et d'initialiser tes variables dizaine et unite.
La methode plus bourine est d'appeler deux fois de suite la methode read dans ton cas.

Si mes explications ne sont pas ultra claires je reviendrai en mettant de vrai exemple de code mais je suis sur mon téléphone là donc c'est un peu compliqué :slight_smile:

Et puis pour progresser...il faut chercher par soit même :wink:

OK Merci Hiko de votre aide.

Je vais essayer d'appliquer tes conseils et je vous tiendrai au courant. :slight_smile:
Merci

Hiko j'ai juste une dernière question svp

Comment faire pour que cette boucle se répète à chaque fois que l'on rentre une donnée dans le moniteur série ?

Merci de votre réponse
Bonne journée.

C'est la finalité du if (Serial.available() > 0) d'attendre que quelque chose arrive

Oui mais je sais pas dans quel ordre il faut que je le mette afin que le programme s'exécute à chaque fois qu'il y a une donnée dans le moniteur série.

Merci de votre aide

Comme te l'as dit fdufnews ça rentrera dans la boucle tout seul avec le test donc te prend pas la tête.
Si tu comprends rien documente toi ici:
http://arduino.cc/en/Serial/read

La fonction loop () est appelée en permanence donc le test du Serial.available () écrit comme il l'est sera testé aussi à chaque fois.

En gros, , dès que loop () est finie, elle recommence. Tu ne devais pas avoir compris ca et c'est pour ca que tu n'avais pas réinitialisé ta variable compte au debut.

Cela veut dire que je dois faire ça :

int incomingByte = 0;
int compte;
int dizaine;
void setup() 
{
   Serial.begin(9600);
}
void loop() 
{
        if (Serial.available() > 0) 
        {       compte=0;
                incomingByte = Serial.read();
                compte++;
                //Serial.print(" I received: ");
                if (compte==2)
                { 
                Serial.write(incomingByte);
                Serial.println();
                dizaine=(incomingByte-48);
                Serial.println(dizaine);
              }
        }
}

J'ai réinitialisé la variable compte et stocker dans incomingBytes mais ça ne marche toujours pas. :frowning:
Donc comment l'écrire ?

Merci de votre réponse

Normal que ça ne marche pas, regarde exactement ce que fais ton code.

Avant de faire ton programme familiarise toi avec le Serial en testant les exemples donnés dans l'IDE Arduino, menu: FICHIER\Exemples\Communications et ceux donnés ici: http://arduino.cc/en/Serial/read

Je t'avais fis que ta variable compte ne sert à rien.
Lis tout le buffer de reception d'un seul coup et traite tes données.

Bonjour les amis,
Oui, la voie série n'est pas d'une utilisation spécialement élémentaire.
Personnellement quand j’expérimente un aspect quelconque du langage C d’Arduino, une fois avoir cerné le principal, et les détails, je me fais un rapport condensé.
Je te joins en « fichier attaché » ma note personnelle qui contient un programme qui permet de récupérer des caractères sur la voie série. Je ne sais pas si ça va t’aider, mais probablement de fournir une piste à soumettre à ta sagacité.
Amicalement : Nulentout

Récupérer une chaîne sur la voie série.pdf (73.2 KB)

Ok merci à tous de votre aide je vais essayer d'utiliser vos conseils.
Je vous tiendrai au courant.

Merci
Bonne journée.

Le code comme je le pense, maintenant que j'ai mon PC sous la main.
Je ne l'ai pas testé, à toi de voir, c'est juste la boucle loop()

//se repete une permanence, appelé dès que la précédente loop() est finie
void loop(void) 
{
  if(Serial.available()>0)
  {
    //Declaration d'un buffer de reception
     char buffer[10];
     //lire 10 octets(au cas où il y a plus) ou jusqu'à ce que setTimeout(c'est a dire 1 sec) soit écoulé
     byte nbreData=Serial.readBytes(buffer, 10);
    //affichage pour toi du nombre de données recues
     Serial.println("Nombre data: "+ String(nbreData));
      //tu peux tester le nombre de donnée recues si tu veux,mais ce test est facultatif
      if(nbreData==2)//parcequ'à ce que j'ai compris tu veux recevoir une dizaine et une unité
      {
         //tu places les données recues dans te svariables
         dizaine=buffer[0];
         unite=buffer[1];
      }       
   } 
}

Ok Merci Hiko
Merci à tous ceux qui mon aidé
Je vous tiendrai au courant lorsque j'aurais mit tout ça au clair.

Bonne soirée.

En Fait voila ce que cela me donne au final :

int unite;
int dizaine;
void setup()
{
  Serial.begin(9600);
}
void loop(void) 
{
  if(Serial.available()>0)
  {
     char buffer[20];
     byte nbreData=Serial.readBytes(buffer,20);
     //Serial.println("Nombre data: "+ String(nbreData));
      if(nbreData==20)
      
      {
         
         dizaine=buffer[17];
         unite=buffer[18];
         delay(100);
         Serial.println(dizaine-48);
         Serial.println(unite-48);
      }       
   } 
}

1000 Mercis à tous ceux qui m'ont aidés :slight_smile:
Le problème a été bien réussit.
Merci

cool pour le retour.
Par contre, pense à faire quelque chose si la condition du test n'est pas bonne, genre si tu n'as pas recu 20 bytes, affiche quelque chose.