Pages: [1]   Go Down
Author Topic: Comment puis-je envoyer un array en post  (Read 944 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 399
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Je suis un peu perdu ou je mélange avec du PHP :o(


Je collecte des positions de cette maniere

Code:
char coords[100];
char lon[15];
char lat[15];
char alt[15];
char time[20];
char vel[15];
char msg1[5];
char msg2[5];

gps.getPar(lon,lat,alt,time,vel);
  Serial.println(lon);
  Serial.println(lat);
  Serial.println(alt);
  Serial.println(time);
  Serial.println(vel);

Jusqu'a là, tip tio, mes Serial print affiche bien ce que je veux voir.

Maintenant j'ai cette fonction, qui fonctionne et qui envoi les donnée au server

Code:
inet.httpPOST(host, port_post, path_post, coords , "Result", 1000);

Le problème est que doit mettre lon, lat,alt,time et vel dans coords et pouvoir rexploiter ces variables "defusionnées", cote php $_POST[], sur le serceur.

Es-ce possible de faire un truc du genre
coords[0]=lat;
coords[1]=lon;
coords[2]=alt;
coords[3]=time;
coords[4]=vel;

et recupérer l'array en PHP ($_POST)

Que me sugérer vous?
En XML, serait-il aussi possible?

Et comment?

Milles milles mercis à vous
« Last Edit: July 13, 2013, 01:51:51 am by pierrot10 » Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3547
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
coords[0]=lat;
coords[1]=lon;
coords[2]=alt;
coords[3]=time;
coords[4]=vel;
Il faudrait que coords soit un tableau de tableau de char pour que cela fonctionne. Mais cela ne mettrait pas les chaînes bout à bout.
Si j'ai bien compris tu voudrais concaténer tes chaînes pour les passer en argument
Peut être que tu pourrais faire quelque chose avec strcat
Pour les besoins du test j'ai initialisé les variables.
Attention à la taille de coords si jamais la concaténation déborde cela plante le programme
Code:
char coords[100]={""};
char lon[15]={"12.324"};
char lat[15]={"4.3568"};
char alt[15]={"1234"};
char time[20]={"12:45"};
char vel[15]={"92"};
char msg1[5];
char msg2[5];

void setup(void){
  Serial.begin(9600);
  strcat(coords,lon);
  strcat(coords,"+");
  strcat(coords,lat);
  strcat(coords,"+");
  strcat(coords,alt);
  strcat(coords,"+");
  strcat(coords,time);
  strcat(coords,"+");
  strcat(coords,vel);
  Serial.print(coords);
}

void loop(void){}
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 399
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ben mon probleme il est la.

Je le faisait ainsi
Code:
strcpy (coords,"lat=");
  strcat (coords,lat);
     
  strcat (coords,"&long=");
  strcat (coords,lon);
     
  strcat (coords,"&alt=");
  strcat (coords,alt);
     
  strcat (coords,"&vel=");
  strcat (coords,vel);
     
  strcat (coords,"&time=");
  strcat (coords,time);
     
  #ifdef DEBUG
    Serial.print(F("Coords : "));                               
    Serial.println(coords);
  #endif

Mais pour une raison que j'ignore, mon programe crache 4 seconde apres avoir commencé. un peu comme si on faisait un reset. Par contre si je commente, le strcat et strcpy, ca ne crache plus.....

Alors je cherche a comprendre ou une alternative..., et c est pourquoi j'ai pensé a une array.

En fait, le besoin est donc de concatener 5 variable en une seul, comme par exemple en php:

Code:
$coords = 'coords='.$lon.','.$lat.','.$alt.','.$time.','.$vel;
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3547
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Mais pour une raison que j'ignore, mon programme crash 4 secondes apres avoir commencé. un peu comme si on faisait un reset
Cela me fait penser à une chaîne qui déborde.
Es-tu certain que ton tableau de 100 est suffisamment long dans tous les cas.
si on regarde ça:
Code:
char coords[100];
char lon[15];
char lat[15];
char alt[15];
char time[20];
char vel[15];
et ça
Code:
strcpy (coords,"lat=");
  strcat (coords,lat);
     
  strcat (coords,"&long=");
  strcat (coords,lon);
     
  strcat (coords,"&alt=");
  strcat (coords,alt);
     
  strcat (coords,"&vel=");
  strcat (coords,vel);
     
  strcat (coords,"&time=");
  strcat (coords,time);
On peut s'interroger

Les chaînes constantes font déjà 26 caractères
Les variables sont dimensionnées à 15 ou 20 si on fait la somme on arrive à 80 caractères.
A chaque concaténation on gagne le terminateur de chaîne pour le terme que l'on ajoute ce qui fait que l'on gagne 5 caractères. On arrive quand même à 105 caractères ce qui déborde de ton buffer de 100.

Pour dépanner, tu devrais:
  1) faire imprimer tes variables  lon, lat, alt, time, vel pour vérifier qu'elles sont correctes (un terminateur manquant lors de la construction d'une chaîne peut tout planter)
  2) faire imprimer après chaque strcat pour vérifier que la chaîne résultante n'excède pas 99 caractères (ne pas oublier de prévoir 1 caractère de plus pour la fin de chaîne)
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 399
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello
merci pour ta réponse. J'ai du mal a te suivre.

Oui en effet, il y a 26 caractere entre les "&xxx="

Pour les lat lon, ..., il y a un maximum de 15 caracteres, mais dans mon cas il y en a 10

J'ai change le code ainsi

Code:
// A savoir que:
char coords[46];
#define COORDSSIZ 15
char lon[COORDSSIZ];
char lat[COORDSSIZ];
char alt[COORDSSIZ];
char time[20];
char vel[COORDSSIZ];
void getGPSCoords(){
  #ifdef DEBUG
    stat=gps.getStat();
    if(stat==1){
      Serial.println("NOT FIXED");
    }else if(stat==0){
      Serial.println("GPS OFF");
    }else if(stat==2){
      Serial.println("2D FIXED");
    }else if(stat==3){
      Serial.println("3D FIXED");
    }
    delay(5000);
  #endif   
 
  //Get data from GPS
 
  gps.getPar(lon,lat,alt,time,vel);
 
  Serial.println(lon);
  Serial.println(lat);
  Serial.println(alt);
  Serial.println(time);
  Serial.println(vel);
 
  strcpy(coords,"long=");
  strncat(coords,lon,COORDSSIZ); //21
 
  strcat(coords,"&lat=");        //25
  strncat(coords,lat,COORDSSIZ);//40

  strcat(coords,"&alti=");        //46
/*
  strncat(coords,alt,COORDSSIZ);  //61
 
  strcat(coords,"&t=");        //64
  strncat(coords,time,20);      //84
 
 
  strcat(coords,"&vel=");  //89
  strncat(coords,vel,COORDSSIZ);  //114
  */
 
 
 
  #ifdef DEBUG
    Serial.print(F("Coords : "));                               
    Serial.println(coords);
  #endif
 
}

A savoir que la fonction  gps.getPar(lon,lat,alt,time,vel);
fourni les valeurs pour :
Quote
lon : 608.487270
lat : 4613.154144
alt : 449.156219
time : 20130714172921.000
vel : 0.000000


Mais que veux tu dire par
Quote
A chaque concaténation on gagne le terminateur de chaîne
Es-ce que le terminateur de chaine est le "\0"

Parce que la en effet, j'ai pas pensé à ca, et pour être franc je ne sais pas comment modifier mes variable/script.
Je pensais que de donner une valeur à une variable char, le \0 est automatique.

Pourrais-tu m'éclairecir, la dessus?

Il y a une autre chose intéressante que j'ai constaté hier soir.
Dans le code que j'ai collé, ci-dessus, il y a un commentaire qui rend une partie de strcat non fonctionnel.

Ma variable coords affiche ce que je veux
Quote
Coords : long=608.487270&lat=4613.154144&alti=
Mais du moment quze je décommente cette partie, il plante.
Donc ca plante à partir de
Code:
strcat(coords,"&alti=");        //46

Bien entendu, quand je décommente cette partie, j'augmente la valeur de
Code:
char coords[46];
comme par exemple
Code:
char coords[114];
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Offline Offline
Sr. Member
****
Karma: 0
Posts: 399
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je ne suis pas trop favorable à ceci, mais ne serait pas possible de trouver une alternative comme ceci:
Code:
String fix = "long=" + String(lon) + "&lat=" + String(lat) + "&alti=" + String(alt) + "&vel=" + String(vel) + "&time=" + String(time);
  char coord[]="";
  strcpy(coord,fix);
Dans lée cas ci-dessous, ca ne marche pas, car il n'accepte pas un String dans un char.

Mais, dans ce cas, es-ce possible de convertir un String en un char?

J'ai aussi pensé à ca, si non:
Code:
  char fix[144] = {"long=" + String(lon) + "&lat=" + String(lat) + "&alti=" + String(alt) + "&vel=" + String(vel) + "&time=" + String(time) + "\0"};
Mais j'ai ce message d'erreur:
Quote
Can not covert 'StringSumHelper' to 'char' in initlization

Merci pour votre aide precieuse
« Last Edit: July 14, 2013, 01:43:01 pm by pierrot10 » Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3547
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Mais que veux tu dire par
Quote
A chaque concaténation on gagne le terminateur de chaîne
Es-ce que le terminateur de chaine est le "\0"

Parce que la en effet, j'ai pas pensé à ca, et pour être franc je ne sais pas comment modifier mes variable/script.
Je pensais que de donner une valeur à une variable char, le \0 est automatique.

Pourrais-tu m'éclaircir, la dessus?


Oui, oui dans les affectations lors de la définition des variables et lors des opérations strcat, strcpy, str.... le terminateur est ajouté automatiquement. Par contre lorsqu'on construit une chaîne octet par octet (ce qui se produit lorsqu'on reçoit des caractères sur une liaison série par exemple) là il peut y avoir des cas où il n'y a pas de terminateur tout de dépend de la manière utilisée pour construire la chaîne.

Si tu as une chaîne de 10 caractères, il faut un tableau de 11 octets pour la stocker (10 caractères + \0)
Si tu prends 2 tableaux comme ci-dessus la concaténation des 2 chaînes donne une chaîne de 20 caractères + 1 terminateur donc il faut 21 octets. De 2 tableaux de 11 octets on arrive à 1 tableau de 21 octets

Je ne suis pas trop favorable à ceci, mais ne serait pas possible de trouver une alternative comme ceci:
Code:
String fix = "long=" + String(lon) + "&lat=" + String(lat) + "&alti=" + String(alt) + "&vel=" + String(vel) + "&time=" + String(time);
  char coord[]="";
  strcpy(coord,fix);
Dans lée cas ci-dessous, ca ne marche pas, car il n'accepte pas un String dans un char.

Mais, dans ce cas, est-ce possible de convertir un String en un char?


Il y a la méthode StringToCharArray pour faire ça.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 399
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci pour ta réponse.
Je deviens un peu fou  smiley

je fais ceci:
Code:
String fix = "long=" + String(lon) + "&lat=" + String(lat) + "&alti=" + String(alt) + "&vel=" + String(vel) + "&time=" + String(time);


 Serial.println(fix);
 Serial.println(fix.length());
fix.toCharArray(coords, 109);
//(j'aimerais remplacé 109 par fix.length()+1
//char coords[fix.length()+1];
//fix.toCharArray(coords, fix.length()+1);
// Le +1 pour laisser une place au terminateur, comme tu me l a expliqué

pourquoi fix n'affiche rien? Il affiche vide.
(lon, lat, alt, vel, time, sont des char.
« Last Edit: July 14, 2013, 03:45:48 pm by pierrot10 » Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Offline Offline
Sr. Member
****
Karma: 0
Posts: 399
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aussi, ca ca ne marche pas non plus

Code:
String message = "test1"+"test2";
Le message d'erreur : "Invalid  operands of types 'const char [5]' and 'const char [5]' to binary 'operateu' +"

J'essaye de concatener des String, maintenant.
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3547
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
fix.toCharArray(coords, 109);
//(j'aimerais remplacé 109 par fix.length()+1
Non c'est une fausse bonne idée. La valeur passée en argument est une limite haute à ne pas dépasser (pour éviter les débordement de chaîne). Il faut mettre la taille de la variable qui va accueillir la chaîne. Comme ça si tu essayes de copier trop de caractères la chaîne sera tronquée afin de ne pas corrompre la mémoire.

Aussi, ca ca ne marche pas non plus

Code:
String message = "test1"+"test2";
Le message d'erreur : "Invalid  operands of types 'const char [5]' and 'const char [5]' to binary 'operateu' +"

J'essaye de concatener des String, maintenant.
La surcharge de l'opérateur + ne fonctionne qu'avec des objets String pas avec des variables de type string.
Logged

Pages: [1]   Go Up
Jump to: