Go Down

Topic: transfert de variable entre fonction (Read 4937 times) previous topic - next topic

angelz

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 :)



fdufnews

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?

angelz

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 :)




B@tto

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
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

angelz

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

fdufnews

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?

angelz

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

...

B@tto

Mais la du coup c'est quoi qui ne marche plus ?
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

angelz

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

B@tto

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){
...

Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

angelz

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

B@tto

#11
Dec 27, 2012, 11:12 am Last Edit: Dec 27, 2012, 11:15 am by B@tto Reason: 1
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
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

skywodd

#12
Dec 27, 2012, 11:35 am Last Edit: Dec 29, 2012, 02:32 pm by skywodd Reason: 1
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]
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

angelz

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

B@tto

@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.
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Go Up