Go Down

Topic: Buffer serial (Read 2 times) previous topic - next topic

jvpython

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

Code: [Select]

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

fdufnews

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.

jvpython

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

fdufnews

#3
Jun 01, 2010, 01:08 pm Last Edit: Jun 01, 2010, 01:12 pm by fdufnews Reason: 1
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:
Code: [Select]
void setup(void){
maVariable = getVar();
}

jvpython

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

Code: [Select]

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

Jean-François

Mets plutôt :

Code: [Select]
if(Serial.available()) {
Serial.println("La methode if marche ?");
return Serial.read();
}


Ta boucle while peut se bloquer de façon infinie .
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

jvpython


Jean-François

#7
Jun 02, 2010, 08:28 am Last Edit: Jun 02, 2010, 08:39 am by jfs Reason: 1
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().
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

jvpython

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

Code: [Select]

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

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


Cyril

Jean-François

#9
Jun 02, 2010, 08:39 am Last Edit: Jun 02, 2010, 08:44 am by jfs Reason: 1
Celui que je t'ai proposé aussi... mais il ne peut pas se bloquer.

Code: [Select]
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 ?
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

jvpython

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.

Code: [Select]

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


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

Cyril

Jean-François

#11
Jun 02, 2010, 09:18 am Last Edit: Jun 02, 2010, 09:23 am by jfs Reason: 1
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 :

Quote

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

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

jvpython

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

Cyril

Jean-François

Avais-tu mis Serial.begin() dans le setup() ?
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

jvpython

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

En fait j'ai fais sa:

Code: [Select]

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

...
}



Go Up