Go Down

Topic: [RESOLU] => MERCI Remplacer client.print par un client.write(buf, len); (Wifi) (Read 6411 times) previous topic - next topic

dudux2

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


dudux2

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.

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.

dudux2

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?

Heloderma-kris

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

dudux2

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" .

dudux2

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

Code: [Select]
//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";

dudux2

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.

Code: [Select]
      // 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++; 
      }



Heloderma-kris

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é!

dudux2

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.

dudux2

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

C'est simple : oublie les String :)

Code: [Select]
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);

....   

   

XavierMiller

C'est en Pascal, cette limitation  ;)

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

dudux2


dudux2

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.

Code: [Select]
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!


Heloderma-kris

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

et de RIEN !

Go Up