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