Dans mon programme, j'aimerai communiquer avec l'utilisateur pour lui demander des informations en vue d'un traitement ultérieur.
Mon code :
void setup()
{
Serial.begin(BAUD); // Ouvre une liaison avec le moniteur série afin de récupérer les données sur l'écran
Serial.print("Saisir la fréquence (en Hz) : ");
while (Serial.available() != 0)
{
f_ech = Serial.read(); //on enregistre la valeur saisie
delay(100); //délai de temporisation
}
Serial.print("la valeur saisie est "); Serial.println(f_ech);
Sauf que quand j'exécute le programme, j'obtiens dans le moniteur série "Saisir la fréquence d'échantillonnage (en Hz) : la valeur saisie est 0" alors que je n'ai rien saisi au clavier !
J'ai essayé en n'affichant pas la phrase d'aide au préalable ("Saisir la fréquence en Hz") mais je retrouve le même problème;
Si tu n'as rien reçu tu passes directement à l'instruction après le while.
Il faut d'abord que tu attendes d'avoir reçu quelque chose puis après tu lis ce que tu as reçu.
while (Serial.available()==0); // attente réception
while (Serial.available() != 0)
{
f_ech = Serial.read(); //on enregistre la valeur saisie
delay(100); //délai de temporisation
}
Ensuite ce n'est pas comme ça que tu vas lire une valeur de plusieurs chiffres.
Il faut soit lire une chaine puis la convertir en entier, soit utiliser Serial.parseInt()
Ah d'accord, je comprends un peu mieux.
J'ai fait la modification en ajoutant la fonction parseInt mais je reçois toujours la valeur 0
void setup()
{
Serial.begin(BAUD); // Ouvre une liaison avec le moniteur série afin de récupérer les données sur l'écran
Serial.print("Saisir la fréquence d'échantillonnage (en Hz) : ");
while (Serial.available() ==0 );
while (Serial.available() != 0)
{
f_ech = Serial.parseInt(); //on enregistre la valeur saisie dans fe
Serial.println(f_ech);
delay(100); //délai de temporisation
}
Serial.print("la valeur saisie est "); Serial.println(f_ech);
C'est bien ça, avec un if en 2ème j'arrive bien à récupérer l'entier.
Si maintenant je souhaite doubler la réception de données, je suis confronté à un problème similaire : il doit me trouver un caractère non affiché.
Par exemple le code
void setup()
{
Serial.print("Saisir la fréquence d'échantillonnage (en Hz) : ");
while (Serial.available() ==0 );
if (Serial.available() != 0)
{
f_ech = Serial.parseInt(); //on enregistre la valeur saisie dans fe
Serial.print(f_ech);
delay(100); //délai de temporisation
}
Serial.print("Saisir le nombre de bits : ");
while (Serial.available() ==0 );
if (Serial.available() != 0)
{
nb_bit = Serial.parseInt(); //on enregistre la valeur saisie dans fe
Serial.print(nb_bit);
delay(100); //délai de temporisation
}
Le fonctionne récupère bien f_ech par contre pour nb_bit j'obtiens toujours 0
C'est bizarre, chez moi (avec un Leonardo), ceci marche parfaitement :
unsigned long f_ech = 0;
unsigned int nb_bit = 0;
void setup()
{
Serial.begin(115200); // <-- Ne pas oublier !!!
while (!Serial); // <-- pour le Leonardo, pas besoin pour un uno ou nano
Serial.print("Saisir la fréquence d'échantillonnage (en Hz) : ");
while (Serial.available() == 0 );
if (Serial.available() != 0)
{
f_ech = Serial.parseInt(); //on enregistre la valeur saisie dans fe
Serial.println(f_ech);
delay(100); //délai de temporisation
}
Serial.print("Saisir le nombre de bits : ");
while (Serial.available() == 0 );
if (Serial.available() != 0)
{
nb_bit = Serial.parseInt(); //on enregistre la valeur saisie dans fe
Serial.println(nb_bit);
delay(100); //délai de temporisation
}
}
void loop() {}
Sortie:
Saisir la fréquence d'échantillonnage (en Hz) : 75000
Saisir le nombre de bits : 12
J'ai changé la fréquence en unsigned long afin de pouvoir prendre en compte des mega ou giga hertz...
nlb:
Le fonctionne récupère bien f_ech par contre pour nb_bit j'obtiens toujours 0
Sans doute que que le terminal envoie les caractères cr lf.
Paramètres le terminal pour ne pas les envoyer. Ou alors il faut les éliminer en réception.
Tu peux aussi simplifier ton programme en supprimant les if, car en sortant du while (Serial.available() ==0 );, Serial.available() est forcément différent de 0.
while (Serial.available() == 0 );
f_ech = Serial.parseInt(); //on enregistre la valeur saisie dans f_ech
Serial.println(f_ech);