Go Down

Topic: [Résolu] Traitement requete GET avec webduino (Read 8382 times) previous topic - next topic

skywodd


Je dis peut-être une bêtise, mais pourquoi tu ne récupères pas de la manière classique?
Du genre http://mon adresse?var1=x&var2=y

C'est ce qu'il fait, mais la librairie Webduino gère déjà en interne la récupération de l'url ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Roxas77

#16
Mar 29, 2013, 09:13 am Last Edit: Mar 29, 2013, 11:50 am by Roxas77 Reason: 1
Oui oui c'est ce que je fait ^^ , et je rentre dans ma fonction mais il ne recupere pas mes valeurs :
Code: [Select]
if(sscanf(url_tail, "newsimu;%d;%d;%d;%d;%d;%d", consigne, type, p , i , d , intervalle) ) {
     server.println("je suis la");
     Serial.println(consigne);
     Serial.println(type);
     Serial.print(p);
     Serial.print(i);
     Serial.print(d);
     Serial.print(intervalle);
   }

J'ai testé le url_tail et j'obtiens :newsimu;25;0;25;24;26 , c'est pourquoi j'ai enlever le "?" que tu avais mis devant .

skywodd

#17
Mar 29, 2013, 12:23 pm Last Edit: Mar 31, 2013, 07:28 pm by skywodd Reason: 1

Code: [Select]
if(sscanf(url_tail, "newsimu;%d;%d;%d;%d;%d;%d", &consigne, &type, &p , &i , &d , &intervalle) ) {


Bon manifestement tu n'as pas remarqué un truc dans mon code ;)
%c -> char
%d -> int
%f -> float
%lf -> double

Soit tu changes le type de tes valeurs consigne, type, p , i , d , intervalle en int soit tu utilises %lf pour les types double ;)


J'ai testé le url_tail et j'obtiens :newsimu;25;0;25;24;26 , c'est pourquoi j'ai enlever le "?" que tu avais mis devant .

Ok webduino enlève le ? de l'url tronqué.
Faire voir le code complet de ta fonction avec le Serial.print pour afficher url_tail.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

marcha

Salut,

Y a un truc suspect qui traine depuis le début du post:
Code: [Select]

while( c != '!' ){
      c = tab[j] ;
      ...
}   


Ne serait-ce pas:

Code: [Select]
  tab[j] = c;

?

Roxas77

Salut ,
Quote
Salut,

Y a un truc suspect qui traine depuis le début du post:
Code:

while( c != '!' ){
      c = tab[j] ;
      ...
}   

Je l'ai enleve et oui je crois que j'avais inversé ^^ .

Skywodd , si j'avais remarqué mais j'avais essayer plusieurs chose c'est pour ça ^^ , le code :
Code: [Select]
void newsimu(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) {
  server.println(url_tail);// il affiche newsimu;25;0;25;24;26
  if (type == WebServer::GET) {
 
    double consigne , intervalle , p , i , d ;
    int type ;
    if(sscanf(url_tail, "newsimu;%lf;%d;%lf;%lf;%lf;%lf",consigne,type,p,i,d,intervalle)){
      server.println(url_tail);
      Serial.println(consigne);
      Serial.println(type);
      Serial.println(p);
      Serial.println(i);
      Serial.println(d);
      Serial.println(intervalle);
    }
  }
}

skywodd

HopHopHop mon coco ya un soucis dans ton url ! ;)
Et ya un gros soucis dans ton sscanf aussi ! (bon ok j'avais moi même oublié :*)

Code: [Select]
void newsimu(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) {
 server.println(url_tail);// il affiche newsimu;25;0;25;24;26 <- il devrait y a voir 6 champs et non 5 !
 if (type == WebServer::GET) {
 
   double consigne , intervalle , p , i , d ;
   int type ;
   if(sscanf(url_tail, "newsimu;%lf;%d;%lf;%lf;%lf;%lf", &consigne, &type, &p, &i, &d, &intervalle) == 6){ // sscanf attend des pointeurs sur variables !
   // <- ne pas oublier le test du nombre de champs lus
     server.println(url_tail);
     Serial.println(consigne);
     Serial.println(type);
     Serial.println(p);
     Serial.println(i);
     Serial.println(d);
     Serial.println(intervalle);
   }
 }
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Roxas77

Ah ok ok j'avais meme pas remarqué qu'il me manquait un champ x) .

J'ai essayer le correctif et je n'arrive pas a avoir le 6eme champs et puis j'ai essayer de voir juste avec 5 champs quand même pour voir si ca fonctionnait et puis b ca fonctionne pas x) .

C'est la loose  :(  . je continue de regarder :) je te tiens au courant .

skywodd


J'ai essayer le correctif et je n'arrive pas a avoir le 6eme champs et puis j'ai essayer de voir juste avec 5 champs quand même pour voir si ca fonctionnait et puis b ca fonctionne pas x) .

J'ai testé le morceau de code du sscanf() sur ordinateur :
Code: [Select]
#include <stdio.h>

int main(int argc, char** argv) {
double consigne, intervalle, p, i, d;
    int type ;
   
if(argc == 1) return 1;

if(sscanf(argv[1], "newsimu;%lf;%d;%lf;%lf;%lf;%lf",&consigne, &type, &p, &i, &d, &intervalle) == 6) {
printf("consigne: %lf\n", consigne);
printf("type: %d\n", type);
printf("p: %lf\n", p);
printf("i: %lf\n", i);
printf("d: %lf\n", d);
printf("intervalle: %lf\n", intervalle);
    }

return 0;
}


Et ça à l'air de marcher :
Code: [Select]
test.exe newsimu;25;0;25;24;26;13
consigne: 25.000000
type: 0
p: 25.000000
i: 24.000000
d: 26.000000
intervalle: 13.000000


Regarde bien ce que tu reçois dans url_tail mais normalement ça devrait le faire ...
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Roxas77

C'est bon j'ai réussi !!!!!!  :smiley-yell: j'en suis venu a bout :D
Apparemment il gérait pas les %lf , donc j'ai tout mis en "int" et j'ai essayer avec les valeurs  9999 et il me les prend en compte cependant je doit avoir des nombres a virgules donc il faut que j'arrive a trouver une solution .

skywodd


Apparemment il gérait pas les %lf , donc j'ai tout mis en "int" et j'ai essayer avec les valeurs  9999 et il me les prend en compte cependant je doit avoir des nombres a virgules donc il faut que j'arrive a trouver une solution .

MAIS OUI ... je suis vraiment c*n parfois !
La avr-libc ne supporte pas (de base) les flottants dans les fonctions de stdio (scanf, printf, ...) d'où les fonctions spécialisés dtostrf(), etc ...
(c'est une histoire de place, le support des flottants demande un max de place en flash)

Il y a une option du linker pour activer le support des flottants mais avec l'ide arduino c'est impossible de le mettre ...
Essaye de chainer plusieurs strtod() (en sautant le ; entre chaque champ) :
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga5ee4d110a3bb55d2eadda05e3ebedf8a
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Roxas77

#25
Apr 04, 2013, 09:06 am Last Edit: Apr 04, 2013, 10:26 am by Roxas77 Reason: 1
Ouais ok ok merci mais le souci c'est que "url_tail" il bloque a un certain nombre de caractère ( 26 je crois ) du coup si en plus je met les double b ca va être la galère ... donc j'ai cherché dans la lib WebServer.h mais je trouve pas ou il a pu être définie a 26 parce que une URL normalement n'est pas limité enfin la y'a un hic quelque part et je ne vois pas ou c'est .

Dans tout les cas j'ai essayer le atof je le trouve plus simple a utilisé  ;) et ça à l'air de fonctionner . Me manque plus qu'a régler ce problème de longueur et a couper la chaine pour la fonction "newsimu" mais du coup si je coupe la chaine avant le sscanf il ne sert plus a rien enfin je ne vois pas ce que tu pense ?

skywodd

Ligne 51 je vois :
Code: [Select]
#define WEBDUINO_DEFAULT_REQUEST_LENGTH 32
Ça doit surement être ça qui défini la taille max de l'url.

Sinon oui avec atof plus besoin de sscanf().
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Roxas77

#27
Apr 04, 2013, 08:31 pm Last Edit: Apr 05, 2013, 09:39 am by Roxas77 Reason: 1
Yep c'etait ca ^^ je l'ai mis a 64 ca devrait aller maintenant   XD .

C'est bon ça fonctionne bien j'ai réussi a tout récupérer :D Je te remercie pour tes conseils ^^ .
A bientot parce que mon projet n'est pas encore terminé :p .

Go Up