Buffer serial

Bonjour a tous, J'ai écrit un programme qui assigne une valeur a une variable de type const de la manière si dessous.

const int maVariable = getVar();

void setup() {...}

void loop() {...}

int getVar() {
  while(!Serial.available()) {}
  return Serial.read();
}

Ca me semble une bonne méthode pour initialisé la variable par Serial mais le problème est que l'arduino ne lit rien comme si le buffer serial reste vide quand il devrais recevoir de l'information. J'ai fais des teste et le arduino est OK normalement. Je ne comprend pas ce qui ce passe. Merci

Cyril

une constante, comme son nom l'indique, est constante on ne peut pas la changer, sa valeur est déterminée à la compilation. Si tu veux pouvoir modifier une valeur à l'exécution, même qu'une seule fois à l'initialisation, il faut que ce soit une variable classique.

Merci pour la réponse. Mais ce qui et bizarre c'est que même quand elle n'est pas const ça ne marche pas. Etrange... :-?

Cyril

En fait je ne suis pas sûr que l’on puisse appeler une fonction à la création d’une variable. Tu pourrais plutôt essayer ça:

void setup(void){
maVariable = getVar();
}

Ce qui est encore plus bizarre c'est que si je fais:

int maVariable = getVar();

void setup() {...}

void loop() {...}

int getVar() {
  Serial.println("La methode getVar march?");

  while(!Serial.available()) {}
  return Serial.read();
}

La commande Serial.println marche mais pas Serial.read. ;)

Cyril

Mets plutôt :

 if(Serial.available()) {
Serial.println("La methode if marche ?");
return Serial.read();
}

Ta boucle while peut se bloquer de façon infinie .

Pourquoi??? :)

Cyril

Tant que la condition while n'est pas remplie tu restes dans while et le reste du programme ne peut pas se dérouler. Avec if si la condition n'est pas remplie, le reste du programme se déroule sans ce qui se trouve dans la fonction conditionné par le if().

Mais le bute dans ce programme c'est d'attendre que l'utilisateur envoye un nombre.

int getVar() {
  Serial.println("La methode getVar march?");

  while(!Serial.available()) {} // Attend qu'un nombre soit envoyé
  return Serial.read();
}

Cyril

Celui que je t’ai proposé aussi… mais il ne peut pas se bloquer.

if(Serial.available()) { //si un nombre est envoyé...fait ce qui est dans la boucle if()
 Serial.println("La methode if marche ?");
 Serial.println (Serial.read()); // écrit ce qui "rentre"
 return Serial.read();
}

Comment envoies-tu ton nombre, comment est branché ton Arduino ?

Merci pour la réponse. Je comprend mais mon problème c'est que le nombre n'est pas forcement envoyé tous de suite donc il faudrait une méthode qui attend que l'utilisateur envoyé un nombre.

if (Serial.available()) {...}

Cela marche une fois mais n'attend pas. ;)

Cyril

Tu mets la suite de ce que tu veux faire dans la boucle if(), comme la question est posée à chaque boucle loop(), c'est comme si tu attendais que l'on envoie un chiffre. Et en attendant cette action, ton arduino peut faire autre chose... passer l'aspirateur, faire la vaisselle ;D

Ce code fonctionne :

int maVariable = getVar();

void setup() { Serial.begin(9600); }

void loop() {

getVar(); }

int getVar() { if(Serial.available()) { //si un nombre est envoyé...fait ce qui est dans la boucle if() Serial.println("La methode if marche ?"); Serial.println (Serial.read()); // écrit ce qui "rentre" return Serial.read(); } }

Merci, c’est vrais que je pourrais faire sa. Mais peux tu m’expliquer pourquoi la boucle while marchait pas, juste par curiosité. :wink:

Cyril

Avais-tu mis Serial.begin() dans le setup() ?

Oui, la preuve c'est que Serial.println marche.

En fait j'ai fais sa:

int getVar() {
Serial.begin(9600);

...
}

Mets le Serial.begin(9600) dans le setup.

Ensuite, tu déclares ta fonction int getVar() en dehors de loop() et de setup() (c'est juste), mais est-ce que tu fais appel à elle dans ton loop() ?

Non, voila comment je prévoyiez a la base de faire sa:

int maVariable = getVar();

void setup() {...}

void loop() {...}

int getVar() {
  Serial.begin(9600);

  while(!Serial.available()) {}
  return Serial.read();
}

Je ne vois pas pourquoi ce code ne marche pas! :-?

Cyril

Simplement parce que {...} ça ne veux rien dire et que tu n'appelles jamais ta fonction dans ta loop(), donc ton programme tourne à vide.

loop() est la boucle principale (main() normalement en C/C++) c'est là que tu mentionnes tout ce que tu veux que ton programme fasse.

"..." veux dire le reste de mon code mais ce n'est pas le but. Tous ce que je veux c'est une méthode "getVar" qui assigne une valeur a une variable au début du programme avant même que setup() et loop() commence.

Cyril

Bon.... imagine que le processeur c'est toi.

Tous les matins tu vas au travail, mais d'abord tu te réveilles (mise sous tension) ensuite tu déjeunes (le bootloader) et tu prends ton premier café au boulot ou tu vas lire l'ordre du jour (le setup) et ensuite tu te mets au boulot (loop()).

A ton avis à quel moment tu peux intégrer des choses relative à ta journée de boulot ?

Le setup() est là pour faire ce que tu aimerais faire.