Go Down

Topic: Simple Affichage de caractère (Read 4392 times) previous topic - next topic

2325

May 08, 2014, 05:40 pm Last Edit: May 08, 2014, 08:58 pm by 2325 Reason: 1
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 :
Code: [Select]

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.

Hiko

#1
May 09, 2014, 08:50 am Last Edit: May 09, 2014, 09:13 am by Hiko Reason: 1
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é :)

Et puis pour progresser...il faut chercher par soit même ;)

2325

#2
May 09, 2014, 04:39 pm Last Edit: May 09, 2014, 05:52 pm by 2325 Reason: 1
OK Merci Hiko de votre aide.

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

2325

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.

fdufnews

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

2325

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

john_lenfr

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

Hiko

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.

2325

Cela veut dire que je dois faire ça :

Code: [Select]

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. :(
Donc comment l'écrire ?

Merci de votre réponse 

john_lenfr

#9
May 10, 2014, 02:32 pm Last Edit: May 10, 2014, 02:35 pm by john_lenfr Reason: 1
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

Hiko

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.

nulentout

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

2325

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

Merci
Bonne journée.

Hiko

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

Code: [Select]

//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];
      }       
   }
}

2325

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.

Go Up