[RESOLU] => MERCI Remplacer client.print par un client.write(buf, len); (Wifi)

Ah...

Encore une chose: "deprecated conversion from string constant to 'char*'"

Oui par "mesure de simplicité", j'ai utilisé String comme type de données pour data.

Comment mettre toute mes données dans le bon format pour éviter cela?
Désolé j'ai vraiment un soucis avec String, string,char, et le tout combiné avec les arrays et les pointeurs... Merci d'avance.

format actuel:

String data;
   
    data = "do=data&func=0&to=0&val=0&valfloat=0&date=0&data="+dateTimeForWeb()+","
        +EEPROM.readByte(EElightPwmMax1)+","+EEPROM.readByte(EElightPwmMax2)+","+EEPROM.readByte(EElightPwmMax3)+","+EEPROM.readByte(EElightPwmMax4)+","
        +EEPROM.readInt(EElightStartTime1)+","+EEPROM.readInt(EElightStartTime2)+","+EEPROM.readInt(EElightStartTime3)+","+EEPROM.readInt(EElightStartTime4);

C'est simple : oublie les String :slight_smile:

char data[400];
char temp[20];

memset(data,NULL,400);

strcat(data, "do=data&func=0&to=0&val=0&valfloat=0&date=0&data=");
strcat(data,dateTimeForWeb());
strcat(data,",");

memset(temp,NULL,20);
itoa(EEPROM.readByte(EElightPwmMax1),temp,10);

strcat(data,temp);

....

Merci,

Je mets en service ce week end!

+1 avec B@tto ,
il parait plus simple au debut d'utilisé les string mais c'est ce voilé la face et repouser le probléme des pointeur alors qu'avec un peut de travail on les comprend bien et ça devien efficase!
perso je ne les utilise jamais ( les string), par contre juse et abuse des tableaux de char et des pointer!

Merci les gars!

Je sais bien, c'est pour ça que je fais appelle a vous!

Avec ces exemples, je vais pouvoir en abusé maintenant...

Bon je vais commencer a être chiant, mais c'est pas très pratique pour calculer la taille de mon tableau automatiquement.

J'ai besoin de la valeur réelle a envoyé pour le transfert en POST.
J'aime pas trop le mode chunked, car il est même pas fonctionnel pour apache 2.4.9. Dans la version 2.5, il sera mieux implanté.

Bonne soirée.

je ne me souvient pas si c'est la taille complete de la trame avec les donne poste qu'il faut ou juste la taille de chaine des variable passer en POST car sinon vu que tu met tout dans un tableau un rapide parcour avec un index qui s'incrémente et s'aréte lorsque tu tombe sur 0 et donnera la taille en octet puisque un char =un octet.

Heloderma-kris:
je ne me souvient pas si c'est la taille complete de la trame avec les donne poste qu'il faut ou juste la taille de chaine des variable passer en POST car sinon vu que tu met tout dans un tableau un rapide parcour avec un index qui s'incrémente et s'aréte lorsque tu tombe sur 0 et donnera la taille en octet puisque un char =un octet.

c'est bien la taille de la chaine passer en poste qui compte, je regarde pour faire ça. Pour le fin de ligne, c'est bien 2 caractères qu'il faut compter?

en générale la fin de la requete doit ce terminer par "\r\n\r\n" ou "\r\n" donc CR LF CR LF ou CR LF donc soit 2 soit 4 character

Voila ce que je faisais avant et qui fonctionnait:

client.println( "Connection: close" );
client.println();

le "Connection: close" il n'est pas utile alors? je peux remplacé ces 2 lignes par "\r\n\r\n" .

Bon du coup, j'ai trouvé une petite source php, qui me donne la réponse...

//la requête
$envoi  = "POST / HTTP/1.1\r\n";
$envoi .= "Host: ".$name."\r\n";
$envoi .= "Connection: Close\r\n";
$envoi .= "Content-type: application/x-www-form-urlencoded\r\n";
$envoi .= "Content-Length: ".strlen($data)."\r\n\r\n";
$envoi .= $data."\r\n";

C'est génial ce if(data != 0), lorsque je declare un tableau plus grand que ce dont j'ai besoin (vu que mes variables sont de longueur variables) Eh bien il me supprime tout ce qui n'a pas ete rempli =NULL.
* *      // On recupere la chaine de caractere pour la mettre dans un tableau de pointeur       for( unsigned int i = 0 ; i < sizeof(data); i++)       {         if(data[i] != 0)           dataSend[i] = byte(data[i]);         else           counter++;        }* *

c'est normal car dans un tableau de char assimilable a un tableau de pointeur les case non initialisé pointe sur l'adresse "0" ou pointer null , donc dans la boucle on verifi que la valeur de l'adresse est si elle pointe sur 0 alors il n'y a pas de carracter suivant ! donc on arrete de lire.
c'est exactement a ça que sert un buffer c'est un androit de la memoir predefini que l'on va utiliser comme un stockage temporaire , une foi que l'on a remplis cette espace ( entierement ou partiellement) on va lire et envoyer les donné ou utilisé!

La, je me colle le remplacement de tout mes String dans les divers fonctions de mon code depuis 3 jours.

C'est une très bonne optimisation!

Au vu de l'avancement du code, le travail reste fastidieux.

Je vous remonte le résultat du gain de temps de la transmission des données lorsque j'aurais franchi cette étape.

Un tableau c'est pas limité a 255? char data[400];

B@tto:
C'est simple : oublie les String :slight_smile:

char data[400];

char temp[20];

memset(data,NULL,400);

strcat(data, "do=data&func=0&to=0&val=0&valfloat=0&date=0&data=");
strcat(data,dateTimeForWeb());
strcat(data,",");

memset(temp,NULL,20);
itoa(EEPROM.readByte(EElightPwmMax1),temp,10);

strcat(data,temp);

....

C'est en Pascal, cette limitation :wink:

Le tableau est limité à la taille disponible dans la pile (défini en dur dans une fonction), l'espace global ou le tas (via malloc() ).

Merci pour cette précision.

Salut vacancier et a ceux qui bosse!

Je voulais vous remerciez pour votre aide, car aujourd'hui ça fonctionne très bien. J'ai remplacé tous les String que j'utilisais dans mon code par des tableaux de caractères.

RESULTATS: j'envois maintenant 390 caracteres en 2 secondes au lieux de 320 caracteres en 6 secondes. Je prend en compte la lecture des variables et la construction de la chaine.

Je fais un découpage de la chaine en 64 octets, sinon pas d'envois de données si j'augmente la taille du tampon. Overflow sans doute...

Personnellement entre un découpage en 32 octets et 64 octets, je n'est pas de gain signifiant en temps. Du coup je vais surement passé à 32 octets.

Question: Dans quel but tu as utilisé un delay dans cette fonction? Tu as un système multitâche?
Pour ma part je l'ai supprimer.

Heloderma-kris:

void sendBuff()

{

m_client.write(m_Buff_Envoi, (m_cursBuffer));/// on envoi le buffer
  delay(1);
  for (int i=0; i<tBufferEnvoi; i++) /// on efface les donné du buffer
  {
      m_Buff_Envoi[i]=uint8_t(0);
  }
  m_cursBuffer=1;/// on reposition notre curseur en debut de buffer
 #ifdef DEBUG_SERIAL
  Serial.println(F("fin envoi donnes :"));
  #endif
  return;
}

Et encore un grand MERCI!

a vrai dir je ne sait plus trops , vraisemblablement pour laisser du temps avant de ferme la conection !

et de RIEN !