Arduino Forum

International => Français => Topic started by: angelz on Dec 25, 2012, 12:42 pm

Title: transfert de variable entre fonction
Post by: angelz on Dec 25, 2012, 12:42 pm
Bonjour à tous et joyeux noël :),

Je reviens vers vous car j'ai un petit souci de « transfert » de variables

Voilà le topo :
Je créer une télécommande tactile avec Xbee.
Donc 1 cote serveur avec une arduino mega un ethernet shield et un lcd et 1 xbee
Et de l'autre la télécommande avec une arduino mega 1 xbee et un tft tactile.

La communication entre les 2 se fait bien.

Le seul souci que je rencontre (pour le moment ^^) est lors du traitement de la réception du message envoyer par la télécommande vers le serveur.

Coté serveur je reçois bien le message et c'est là que ca bloque ?
Code serveur  :

Code: [Select]

void reception_xbee(){
  message = "";
  char character;
  while(Serial3.available() > 0) {
      character = Serial3.read();
      message.concat(character);
  }
  if (message != "") {
Serial.println(message);
GLCD.CursorTo(1, 3);
GLCD.print("commande : "+ message);
  action_reception_xbee(message);
  }
       delay(1000);
}
void action_reception_xbee(String arg2){

//  Serial.println("test");
// Serial.print("arg2 = ");
// Serial.println(arg2);
   // Cuisine   
    if(String(arg2=="lumiere_cuisine_plafond_on")){
      Serial.println("cuisine on");
      GLCD.CursorTo(1, 3);
      GLCD.print("cuisine on");
      envoie_linknx("Lumiere_Cuisine_Spots_Cmd" , "on");
     
    }
    else if(String(arg2=="lumiere_cuisine_plafond_off")){
    Serial.println("cuisine off");
      GLCD.CursorTo(1, 3);
      GLCD.print("cuisine off");
      envoie_linknx("Lumiere_Cuisine_Spots_Cmd" , "off");
   }
    delay(3000);
}

void envoie_linknx(String id, String valeur){

// et c'est la que je ne comprends pas
//    else if(String(arg2=="lumiere_cuisine_plafond_on" ))la ca va bien
//      envoie_linknx("Lumiere_Cuisine_Spots_Cmd" , "on");
//je vois bien sur la console série l'id et la valeur on
// par contre avec
//    else if(String(arg2=="lumiere_cuisine_plafond_off")) la ca va pas
//        envoie_linknx("Lumiere_Cuisine_Spots_Cmd" , "off");
// Je reçois l'id on et la valeur on … alors que ça devrait être off
// J'ai essayé avec des in comme valeur même souci le 1 passe toujours et pas le 0
  Serial.println(id);
  Serial.println(valeur);

}





Voilà si quelqu'un pouvez me débloquer cela serait un beau cadeau de noël :)


Title: Re: transfert de variable entre fonction
Post by: fdufnews on Dec 25, 2012, 03:16 pm
On a pas tous la même configuration que toi, donc si tu nous expliquais ce qui coince dans ton système ce serait quand même plus simple pour t'aider.
Qu'attends-tu?
Qu'obtiens-tu?
Title: Re: transfert de variable entre fonction
Post by: angelz on Dec 25, 2012, 04:37 pm
bonjour
voila je vais essayer de décrire le souci plus clairement :)

Code: [Select]

void action_reception_xbee(String arg2){
 
   if(String(arg2=="lumiere_cuisine_plafond_on")){
     Serial.println("cuisine on");
     GLCD.CursorTo(1, 3);
     GLCD.print("cuisine on");
     envoie_linknx("Lumiere_Cuisine_Spots_Cmd" , "on");
     
   }
   else if(String(arg2=="lumiere_cuisine_plafond_off")){
   Serial.println("cuisine off");
     GLCD.CursorTo(1, 3);
     GLCD.print("cuisine off");
     envoie_linknx("Lumiere_Cuisine_Spots_Cmd" , "off");
  }
   delay(3000);
}


void envoie_linknx(String id, String valeur){

 Serial.println(id);
 Serial.println(valeur);

}

1 dans la fonction action_reception_xbee() je recois le message de la telecommante envoyer par xbee serial3.println...
2 dans la fonction action_reception_xbee() je traite le message recu,

          Si le message recu est :
                 a- "lumiere_cuisine_plafond_on" --> on appel la fonction envoie_linknx(id, valeur) id = Lumiere_Cuisine_Spots_Cmd valeur : on
                 b- "lumiere_cuisine_plafond_off" --> on appel la fonction envoie_linknx(id, valeur) id = Lumiere_Cuisine_Spots_Cmd valeur : off

3 reception dans la fonction envoie_linknx(String id, String valeur) et affichage des variables.

seulement la je ne comprends pas je recois toujours les valeurs id = Lumiere_Cuisine_Spots_Cmd valeur : on
et jamais id = Lumiere_Cuisine_Spots_Cmd valeur : off ..
c'est la que je ne comprends pas
pourtant si je fait un prinln de valeur avant l'envoi a la fonction envoie_linknx le valeur sont correct on ou off
je ne saispas si je sus super clair :)



Title: Re: transfert de variable entre fonction
Post by: B@tto on Dec 25, 2012, 08:54 pm
C'est simple : ta condition "if(String(arg2=="lumiere_cuisine_plafond_on"))" est toujours valable, tu fait un cast avec la fonction string() ...

Pourquoi pas simplement : if(arg2=="lumiere_cuisine_plafond_on")) ??!

De plus pourquoi un "else if" ensuite ? Un if suffirait
Title: Re: transfert de variable entre fonction
Post by: angelz on Dec 25, 2012, 10:48 pm
Effectivement grosse erreur de ()  :)
Par contre du coup plus rien ne marche ^^
Donc j'ai fait  un test :

Code: [Select]

void action_reception_xbee(String arg2){
Serial.println(arg2); 
// ici je vois bien le bon argument donc soit lumiere_cuisine_plafond_on ou lumiere_cuisine_plafond_off

// et la apparemment  le if ou le else if ne marche pas  du coup  et je ne vois pas pourquoi
    if(arg2=="lumiere_cuisine_plafond_on"){
      Serial.println("cuisine on");
      GLCD.CursorTo(1, 3);
      GLCD.print("cuisine on");
      envoie_linknx("Lumiere_Cuisine_Spots_Cmd" , "on");     
    }
    else if(arg2=="lumiere_cuisine_plafond_off"){
    Serial.println("cuisine off");
      GLCD.CursorTo(1, 3);
      GLCD.print("cuisine off");
      envoie_linknx("Lumiere_Cuisine_Spots_Cmd" , "off");
    }
    delay(3000);
}


si quelqu'un a une idée :)? merci beaucoup

et encore joyeux noel ;)
Title: Re: transfert de variable entre fonction
Post by: fdufnews on Dec 26, 2012, 09:17 am
Dans une partie de ton code, il y a ça:
Quote
envoie_linknx("Lumiere_Cuisine_Spots_Cmd" , "on");

dans une autre, tu as ça:
Quote
arg2=="lumiere_cuisine_plafond_on"


Tu n'aurais pas quelques problèmes de majuscule/minuscule par hasard?
Title: Re: transfert de variable entre fonction
Post by: angelz on Dec 26, 2012, 02:16 pm
bonjour,

j'ai reverifier (on ne sais jms :)) mais en fait ,

arg2=="lumiere_cuisine_plafond_on" est la variable envoyer par une fonction et c'es sur cette variable que je fais le test de condition

alors que 

envoie_linknx("Lumiere_Cuisine_Spots_Cmd" , "on"); est ce que j'envois si la condition est vrai (ca pourrais etre envoie_linknx("test" , "on");

j'ai comme l'impression qu'il  y a un detail qui m'echappe comme si je comparer de type de var differente, mais je ne vois pas comment vu que je les declare toutes en String

...
Title: Re: transfert de variable entre fonction
Post by: B@tto on Dec 26, 2012, 03:35 pm
Mais la du coup c'est quoi qui ne marche plus ?
Title: Re: transfert de variable entre fonction
Post by: angelz on Dec 26, 2012, 05:51 pm
bon je vais reprendre (désolé apparement je n'arrive pas a m'exprimer convenablement ;) ma femme me le dit toujours lo)

Code: [Select]

void action_reception_xbee(String arg2){
Serial.print("arg2= ");
Serial.println(arg2); 
// ici je vois bien le bon argument donc soit lumiere_cuisine_plafond_on ou lumiere_cuisine_plafond_off
donc jusque la ca marche
la variable transmise a la fonction action_reception_xbee est bien recu puisque afficher dans le terminal serie



par contre apres pour le test de condition cela ne marche jms la codition n'est jamais vrai
Code: [Select]

if(arg2=="lumiere_cuisine_plafond_on"){
      Serial.println("cuisine on");
     
    }
else if(arg2=="lumiere_cuisine_plafond_off"){
    Serial.println("cuisine off");

}



si j'appuie sur le bouton ON, je vois dans la connexion serie
Code: [Select]


arg2= lumiere_cuisine_plafond_on



et si j'appuis sur le OFF
Code: [Select]


arg2= lumiere_cuisine_plafond_off





par contre je ne vois pas je resultat du test de condition pourtant cela devrai etre bon puisque ce que je vois sur la con serie est la valeur attendu pour les condition
Serial.println("cuisine on");
ou
Serial.println("cuisine off");
ne marche pas
jene sais pas si j'ai eté super clair
Title: Re: transfert de variable entre fonction
Post by: B@tto on Dec 27, 2012, 09:43 am
Pas de souci, c'est juste qu'il faut avoir tous les éléments en main pour pouvoir cerner le problème ^^

Bizarre, tout me semble correct ... Ca suit bien la référence http://arduino.cc/en/Tutorial/StringComparisonOperators

Il faudrait essayer deux choses :
- d'abord écraser arg2 dans la fonction en le définissant directement :
Code: [Select]

arg2=lumiere_cuisine_plafond_on;

- remplacer les phrases dans la condition par des string préalablement définie :

Code: [Select]

String Str1=lumiere_cuisine_plafond_on;
String Str2=lumiere_cuisine_plafond_off;
if(arg2==Str1){
...

Title: Re: transfert de variable entre fonction
Post by: angelz on Dec 27, 2012, 10:52 am
voila test effectuer :)

si je force arg2
Code: [Select]
arg2=lumiere_cuisine_plafond_on;


la condition est bien tester et est vrai ou fausse suivant ce que je met dans arg2

par contre
Code: [Select]
String Str1=lumiere_cuisine_plafond_on;
String Str2=lumiere_cuisine_plafond_off;
if(arg2==Str1){
...


ne marche pas la condition n'est jamais vrai.

j'ai essayer de recuperer arg2 dans une variable string dans la fonction

Code: [Select]
void action_reception_xbee(String arg2){
String val=arg2;
  Serial.print("arg2 = ");
  Serial.println(arg2);

    Serial.print("val = ");
  Serial.println(val);

   // Cuisine   
    if(val=="lumiere_cuisine_plafond_on"){
      Serial.println("cuisine on");
     
     
    }
    else if(val=="lumiere_cuisine_plafond_off"){
    Serial.println("cuisine off");
         }


voila ce que je vois dans la con serie
si bouton on :
Code: [Select]

arg2 = lumiere_cuisine_plafond_on


val = lumiere_cuisine_plafond_on


si bouton off :

Code: [Select]

arg2 = lumiere_cuisine_plafond_off


val = lumiere_cuisine_plafond_off





je ne vois pas ou es le souci
les valeur sont bonne ... ca devrait fonctionner je pense ...

merci de vorte aide
Title: Re: transfert de variable entre fonction
Post by: B@tto on Dec 27, 2012, 11:12 am
Ok alors c'est le passage d'une string en argument qui pose problème, surement une histoire de pointeur. Je suis pas du tout maitre en la matière mais essaye ça :
Code: [Select]

void action_reception_xbee(char *arg2){

if(arg2=="lumiere_cuisine_plafond_on"){
     Serial.println("cuisine on");
         }
if(arg2=="lumiere_cuisine_plafond_off"){
   Serial.println("cuisine off");
}

}


Un problème peut être le rajout du caractère NULL induit par la déclaration d'une string. Si c'est bien ça en faisant un sizeof() sur ta string avant la fonction, et en le comparant au sizeof() de arg2 il devrait y avoir un écart.

HS : Skywodd doit être en vacances pour ne pas être encore venu protester contre les String :p
Title: Re: transfert de variable entre fonction
Post by: skywodd on Dec 27, 2012, 11:35 am
Code: [Select]
[code]Bonjour,

[quote author=B@tto link=topic=139004.msg1046133#msg1046133 date=1356603160]
Ok alors c'est le passage d'une string en argument qui pose problème, surement une histoire de pointeur. Je suis pas du tout maitre en la matière mais essaye ça :
(...)

Pour une instance de classe tu peut faire un passage par référence si tu ne veut pas de copie de l'objet sur la pile ;)

Ça donne un prototype du genre :
Code: [Select]
void mafonction(String& str);
Dans le corps de la fonction tu utilises str comme une variable classique.
Par contre attention toute modifications dans la fonction sont aussi effectives dans la fonction appelante.

Ps: faire un == entre un pointeur et un tableau de char n'as aucun sens.
Au mieux un if(strcmp(arg2, "blabla") == 0) { ... } mais pas ça, hein B@tto ;)


Un problème peut être le rajout du caractère NULL induit par la déclaration d'une string. Si c'est bien ça en faisant un sizeof() sur ta string avant la fonction, et en le comparant au sizeof() de arg2 il devrait y avoir un écart.

Ralala, tu devrais revoir tes cours sur les pointeurs ;)
sizeof() d'un tableau statique retourne sa taille en octet (nb éléments * taille d'un élément)
sizeof() d'un pointeur retourne la taille d'un pointeur (2 octets sur un AVR)


HS : Skywodd doit être en vacances pour ne pas être encore venu protester contre les String :p

Trop de chose à faire pour l'iut en ce moment ...
Mais je rattrape tout de suite le temps perdu :
LES STRINGS C'EST LE MAL ! :smiley-mr-green:[/code]
Title: Re: transfert de variable entre fonction
Post by: angelz on Dec 27, 2012, 12:59 pm
bonjour,

merci pour vos réponse (ou je n'ai pas tout compris en fait j'ai un peut du mal avec les char :) voila pourquoi j'utilise les string)

par contre ca m'a fais pensé a un truc
je faisais un Serial.println() pour l'envoie par xbee et je l'ai changer pas Serial.print() et la ca passe effectivement c'etait bien un probleme de retour chariot

merci de votre aide
et je vais quand meme essayer de comprendre ces ... char... :)

merci beaucoup
Title: Re: transfert de variable entre fonction
Post by: B@tto on Dec 27, 2012, 01:34 pm
@Skywodd : c'est bien ce que je disais : je suis mauvais en pointeur :)

@Angelz : juste une précision : NULL c'est pas un retour chariot. NULL = '\0'  Retour charriot = '\n' 
Dans les deux cas il ne sont pas à proprement parlé visible dans le moniteur série, mais existe bel et bien, ton problème l'illustre parfaitement. C'est pourquoi il est préférable d'utiliser un tableau de char comme ceci : http://arduino.cc/en/Reference/String    La tu as parfaitement le contrôle sur ta variable. A noter que si tu ne remplis pas completement un tableau, les cases "vides" sont justement des NULL. De plus la classe String utilise des allocations dynamiques de mémoire qui peuvent donner des problèmes inexplicables. Avec un tableau de char tu alloues ta mémoire et tu es tranquille.
Title: Re: transfert de variable entre fonction
Post by: skywodd on Dec 29, 2012, 02:36 pm

@Skywodd : c'est bien ce que je disais : je suis mauvais en pointeur :)

Un pointeur c'est juste une variable qui contient une adresse, en partant de ce principe tout est plus simple.
Tu ne comparerais pas un int et un tableau de char, alors pourquoi le ferai tu avec un pointeur ? etc ... ;)


@Angelz : juste une précision : NULL c'est pas un retour chariot. NULL = '\0'  Retour charriot = '\n' 
Dans les deux cas il ne sont pas à proprement parlé visible dans le moniteur série, mais existe bel et bien, ton problème l'illustre parfaitement. C'est pourquoi il est préférable d'utiliser un tableau de char comme ceci : http://arduino.cc/en/Reference/String    La tu as parfaitement le contrôle sur ta variable. A noter que si tu ne remplis pas completement un tableau, les cases "vides" sont justement des NULL. De plus la classe String utilise des allocations dynamiques de mémoire qui peuvent donner des problèmes inexplicables. Avec un tableau de char tu alloues ta mémoire et tu es tranquille.

Tout est dit :smiley-mr-green: