Go Down

Topic: ESP8266 et arduino (Read 2563 times) previous topic - next topic

EricRecifal33480

Bonsoir,

J'ai essayer de rajouter un fonction pour décoder les HH:MM qui arriveront de mon url mais je me heurte à 2 souci

Le premier que j'avoue continuer à buter sur la fonction strtok et donc je pense que je ne l'utilise pas bien vue que je perd la moitié des paramètres et le reste ressemble à rien

Le second pour faire ma conversion HH:MM --> MM j'utilise le atol mais le par contre la remettre en char alors là :(

En  l'etat sa fait pas le job en tout cas

Code: [Select]

//char *urlBuffer = "/?EtatV1=ON&PManuV1=5&EtatV2=ON&PManuV2=55";
char *urlBuffer ="/?H1V1=01%3A10&P1V1=5&H1V2=10%3A10&P1V2=10&H2V1=01%3A20&P2V1=15&H2V2=10%3A20&P2V2=20&H3V1=01%3A30&P3V1=25&H3V2=10%3A30&P3V2=30&H4V1=01%3A40&P4V1=35&H4V2=10%3A40&P4V2=40&H5V1=01%3A50&P5V1=45&H5V2=10%3A50&P5V2=50&H6V1=02%3A00&P6V1=55&H6V2=11%3A00&P6V2=60&H7V1=02%3A10&P7V1=65&H7V2=11%3A10&P7V2=70&H8V1=02%3A20&P8V1=75&H8V2=11%3A20&P8V2=80";
const byte maxParam = 32;
char *Param[maxParam];
char *Value[maxParam];
byte nbParam;
int PWM;
const int PWM50=127;
const byte Led_V1 = 3;
const byte Led_V2 = 9;
const byte hardRestPIN = 7;
//const char detect[] = "/?Etat";
const char detect[] ="/?H1";
const byte longeurDetect = sizeof(detect) - 1;
const char * egal = "=";
const char * esperluette = "&";
const char * deuxpoints = "%3A";
char *mot;

byte decode()
{
  byte paramEnCours = 0;
  char *debutAnalyse;
  char *ptr;


debutAnalyse = urlBuffer + longeurDetect; // si oui on va commencer à analyser après detect

  if (!strncmp(urlBuffer, detect, longeurDetect)) { // commmence-t-on bien par detect ?

    debutAnalyse = urlBuffer + longeurDetect; // si oui on va commencer à analyser après detect

    ptr = strtok(debutAnalyse, egal);
    if (ptr) {
      while (ptr && (paramEnCours < maxParam)) {
        Param[paramEnCours] = ptr;
        ptr = strtok(NULL, esperluette);
        if (ptr) {
         
         
                    //Debut ajout
         
          if (strstr(ptr, deuxpoints))
           {
            char *val[2];
            int Time;
            ptr= strtok(NULL,deuxpoints);
            val[1]=ptr;
            ptr= strtok(NULL,esperluette);
            val[2]=ptr;
            Time = (60*atol(val[1]))+atol(val[2]); 
            Value[paramEnCours++] ="Decoder la variable";
            }
           

           
          else {Value[paramEnCours++] = ptr;}
                  }
                    //Fin ajout
         
          //Value[paramEnCours++] = ptr;
         
          }
         



        else break;
        ptr = strtok(NULL, egal);
      }
    } else Serial.println(F("pas de signe ="));
  } else Serial.println(F("MAUVAIS DEBUT D'URL"));


  return paramEnCours;
}

void setup() {
  Serial.begin(115200);

  byte n = decode();

  for (byte i = 0; i < n; i++) {
    Serial.print(F("["));
    Serial.print(Param[i]);
    Serial.print(F("] --> ["));
    Serial.print(Value[i]);
    Serial.println(F("]"));
  }
}

void loop() {}

fdufnews

Pour avoir un code plus simple, mieux structuré et évolutif, je verrais plutôt une première boucle qui tronçonnerait l'URL avec strtok en retournant des segments de texte séparés par l'esperluette et un traitement à l'intérieur de cette boucle qui séparerait soit par un second strtok ou par strstr le nom du paramètre et sa valeur.

J-M-L

#32
Sep 13, 2018, 09:48 am Last Edit: Sep 13, 2018, 11:41 am by J-M-L
y'a un soucis de {} dans le code que vous avez posté

Quote
Le second pour faire ma conversion HH:MM --> MM j'utilise le atol mais le par contre la remettre en char alors là :(
si vous avez un int et que vous voulez avoir sa représentation ASCII vous pouvez faire un itoa()


Pour mettre en pratique ce que propose fdufnews, voici le même code que posté précédemment mais qui fait une deuxième analyse / segmentation des valeurs lues pour trouver soit 'xxx%3Axxx' soit 'xxx' et où xxx est un entier

J'ai collé une petite fonction qui construit un entier juste pour le fun, vous pourriez bien sûr utiliser atoi() pour cette partie. l'avantage de ce petit bout de code c'est qu'il vous dit s'il y a une erreur de format des entiers ou pas (mais je n'en tiens pas compte dans mon code)

Code: [Select]
char monURL[] = "/?H1V1=01%3A10&P1V1=5&H1V2=10%3A10&P1V2=10&H2V1=01%3A20&P2V1=15&H2V2=10%3A20&P2V2=20&H3V1=01%3A30&P3V1=25&H3V2=10%3A30&P3V2=30&H4V1=01%3A40&P4V1=35&H4V2=10%3A40&P4V2=40&H5V1=01%3A50&P5V1=45&H5V2=10%3A50&P5V2=50&H6V1=02%3A00&P6V1=55&H6V2=11%3A00&P6V2=60&H7V1=02%3A10&P7V1=65&H7V2=11%3A10&P7V2=70&H8V1=02%3A20&P8V1=75&H8V2=11%3A20&P8V2=80";

const byte maxParam = 30;
char *Param[maxParam];
char *Value[maxParam];
int valueMin[maxParam];
int valueMax[maxParam];
byte nbParam;

const char detect[] = "/?";
const byte longeurDetect = sizeof(detect) - 1;
const char egal[] = "=";
const char esperluette[] = "&";
const char deuxpoints[] = "%3A";
const byte longeurDeuxpoints = sizeof(deuxpoints) - 1;

boolean lireEntier(const char * message, int &data)
{
  boolean erreur = true;
  boolean negatif = false;

  size_t i = 0;

  if (message[0] == '-') {
    negatif = true;
    i++;
  }

  if ((message[i] >= '0') && (message[i] <= '9')) { // si c'est bien un chiffre
    data = 0; // on initialise notre valeur
    erreur = false; // on sait que la lecture retournera au moins queqlue chose de correct
    while ((message[i] >= '0') && (message[i] <= '9')) {
      data = data * 10 + (message[i++] - '0'); // on construit notre entier
    }
    if (negatif) data = -data;
  }
  return erreur;
}


// décode soit 'xxx%3Axxx' soit 'xxx'
boolean decodeParam(byte n)
{
  boolean erreur = true;
  valueMin[n] = 0;
  valueMax[n] = 0;
  char * ptrDeuxPoints = strstr(Value[n], deuxpoints); // http://www.cplusplus.com/reference/cstring/strstr/
  if (ptrDeuxPoints) { // on a trouvé 2 points
    erreur = lireEntier(Value[n], valueMin[n]);
    erreur |= lireEntier(ptrDeuxPoints + longeurDeuxpoints, valueMax[n]);
  } else {
    erreur = lireEntier(Value[n], valueMin[n]);
    if (!erreur) valueMax[n] = valueMin[n]; // un seul nombre
  }
  return erreur;
}



byte decodeURL()
{
  byte paramEnCours = 0;
  char *debutAnalyse;
  char *ptr;

  if (!strncmp(monURL, detect, longeurDetect)) { // commmence-t-on bien par detect ?

    debutAnalyse = monURL + longeurDetect; // si oui on va commencer à analyser après detect

    ptr = strtok(debutAnalyse, egal);
    if (ptr) {
      while (ptr && (paramEnCours < maxParam)) {
        Param[paramEnCours] = ptr;
        ptr = strtok(NULL, esperluette);
        if (ptr) {
          Value[paramEnCours] = ptr;
          decodeParam(paramEnCours);
          paramEnCours++;
        }
        else break;
        ptr = strtok(NULL, egal);
      }
    } else Serial.println(F("pas de signe ="));
  } else Serial.println(F("MAUVAIS DEBUT D'URL"));

  return paramEnCours;
}


void setup() {
  Serial.begin(115200);

  Serial.print(F("Je decode: "));
  Serial.println(monURL);

  byte n = decodeURL();

  for (byte i = 0; i < n; i++) {
    Serial.print(i);
    Serial.print(F("\t["));
    Serial.print(Param[i]);
    Serial.print(F("] --> ["));
    Serial.print(Value[i]);
    Serial.print(F("] soit min= "));
    Serial.print(valueMin[i]);
    Serial.print(F(" et max= "));
    Serial.println(valueMax[i]);
  }
}

void loop() {}


En exécutant cela, vous verrez dans la console Série

Je decode: /?H1V1=01%3A10&P1V1=5&H1V2=10%3A10&P1V2=10&H2V1=01%3A20&P2V1=15&H2V2=10%3A20&P2V2=20&H3V1=01%3A30&P3V1=25&H3V2=10%3A30&P3V2=30&H4V1=01%3A40&P4V1=35&H4V2=10%3A40&P4V2=40&H5V1=01%3A50&P5V1=45&H5V2=10%3A50&P5V2=50&H6V1=02%3A00&P6V1=55&H6V2=11%3A00&P6V2=60&H7V1=02%3A10&P7V1=65&H7V2=11%3A10&P7V2=70&H8V1=02%3A20&P8V1=75&H8V2=11%3A20&P8V2=80
0 [H1V1] --> [01%3A10] soit min= 1 et max= 10
1 [P1V1] --> [5] soit min= 5 et max= 5
2 [H1V2] --> [10%3A10] soit min= 10 et max= 10
3 [P1V2] --> [10] soit min= 10 et max= 10
4 [H2V1] --> [01%3A20] soit min= 1 et max= 20
5 [P2V1] --> [15] soit min= 15 et max= 15
6 [H2V2] --> [10%3A20] soit min= 10 et max= 20
7 [P2V2] --> [20] soit min= 20 et max= 20
8 [H3V1] --> [01%3A30] soit min= 1 et max= 30
9 [P3V1] --> [25] soit min= 25 et max= 25
10 [H3V2] --> [10%3A30] soit min= 10 et max= 30
11 [P3V2] --> [30] soit min= 30 et max= 30
12 [H4V1] --> [01%3A40] soit min= 1 et max= 40
13 [P4V1] --> [35] soit min= 35 et max= 35
14 [H4V2] --> [10%3A40] soit min= 10 et max= 40
15 [P4V2] --> [40] soit min= 40 et max= 40
16 [H5V1] --> [01%3A50] soit min= 1 et max= 50
17 [P5V1] --> [45] soit min= 45 et max= 45
18 [H5V2] --> [10%3A50] soit min= 10 et max= 50
19 [P5V2] --> [50] soit min= 50 et max= 50
20 [H6V1] --> [02%3A00] soit min= 2 et max= 0
21 [P6V1] --> [55] soit min= 55 et max= 55
22 [H6V2] --> [11%3A00] soit min= 11 et max= 0
23 [P6V2] --> [60] soit min= 60 et max= 60
24 [H7V1] --> [02%3A10] soit min= 2 et max= 10
25 [P7V1] --> [65] soit min= 65 et max= 65
26 [H7V2] --> [11%3A10] soit min= 11 et max= 10
27 [P7V2] --> [70] soit min= 70 et max= 70
28 [H8V1] --> [02%3A20] soit min= 2 et max= 20
29 [P8V1] --> [75] soit min= 75 et max= 75

Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

EricRecifal33480

Merci pour cette réponse
J'espere que itoa m'aidera

En gros la variable valuemin du code correspond à l'heure. pour la convertir en minute je la convertis en int et multiplié par 60
Je convertis valuemax en int
J'additionne les 2 valeurs

Le but est de stocker ce résultat dans Value[maxParam]. Donc stocker un int dans une var char

J-M-L

#34
Sep 13, 2018, 01:03 pm Last Edit: Sep 13, 2018, 01:16 pm by J-M-L
Merci pour cette réponse
J'espere que itoa m'aidera

En gros la variable valuemin du code correspond à l'heure. pour la convertir en minute je la convertis en int et multiplié par 60
Je convertis valuemax en int
J'additionne les 2 valeurs

Le but est de stocker ce résultat dans Value[maxParam]. Donc stocker un int dans une var char
ah j'avais pas compris que c'était une heure, j'ai lu un peu vite, je pensais que c'était un min et un max :)

oui pour avoir une seule valeur qui définit le moment de la journée HH x 60 + MM si la lecture n'avait pas donné d'erreur (et bien sûr ne pas prendre mon max = min s'il n'y avait qu'une seule valeur)
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

EricRecifal33480

Le itoa va donc me permettre cette conversion ?

J-M-L

#36
Sep 13, 2018, 04:40 pm Last Edit: Sep 13, 2018, 04:43 pm by J-M-L
itoa() comme indiqué dans la doc prends un int et vous génère sa représentation ASCII dans une certaine base
en modifiant le code précédent pour lire une heures:minutes ou juste heures
Code: [Select]
char monURL[] = "/?H1V1=01%3A10&P1V1=5&H1V2=10%3A10&P1V2=10&H2V1=01%3A20&P2V1=15&H2V2=10%3A20&P2V2=20&H3V1=01%3A30&P3V1=25&H3V2=10%3A30&P3V2=30&H4V1=01%3A40&P4V1=35&H4V2=10%3A40&P4V2=40&H5V1=01%3A50&P5V1=45&H5V2=10%3A50&P5V2=50&H6V1=02%3A00&P6V1=55&H6V2=11%3A00&P6V2=60&H7V1=02%3A10&P7V1=65&H7V2=11%3A10&P7V2=70&H8V1=02%3A20&P8V1=75&H8V2=11%3A20&P8V2=80";

const byte maxParam = 30;
char *Param[maxParam];
char *Value[maxParam];
int horaire[maxParam];
byte nbParam;

const char detect[] = "/?";
const byte longeurDetect = sizeof(detect) - 1;
const char egal[] = "=";
const char esperluette[] = "&";
const char deuxpoints[] = "%3A";
const byte longeurDeuxpoints = sizeof(deuxpoints) - 1;

boolean lireEntier(const char * message, int &data)
{
  boolean erreur = true;
  boolean negatif = false;

  size_t i = 0;

  if (message[0] == '-') {
    negatif = true;
    i++;
  }

  if ((message[i] >= '0') && (message[i] <= '9')) { // si c'est bien un chiffre
    data = 0; // on initialise notre valeur
    erreur = false; // on sait que la lecture retournera au moins queqlue chose de correct
    while ((message[i] >= '0') && (message[i] <= '9')) {
      data = data * 10 + (message[i++] - '0'); // on construit notre entier
    }
    if (negatif) data = -data;
  }
  return erreur;
}


// décode soit 'xxx%3Axxx' soit 'xxx'
boolean decodeParam(byte n)
{
  boolean erreur = true;
  int h = 0;
  int m = 0;
  char * ptrDeuxPoints = strstr(Value[n], deuxpoints); // http://www.cplusplus.com/reference/cstring/strstr/
  if (ptrDeuxPoints) { // on a trouvé 2 points
    erreur = lireEntier(Value[n], h);
    erreur |= lireEntier(ptrDeuxPoints + longeurDeuxpoints, m);
    if (!erreur) horaire[n] = 60 * h + m;
  } else {
    erreur = lireEntier(Value[n], h);
    if (!erreur) horaire[n] = 60 * h;
  }
  return erreur;
}



byte decodeURL()
{
  byte paramEnCours = 0;
  char *debutAnalyse;
  char *ptr;

  if (!strncmp(monURL, detect, longeurDetect)) { // commmence-t-on bien par detect ?

    debutAnalyse = monURL + longeurDetect; // si oui on va commencer à analyser après detect

    ptr = strtok(debutAnalyse, egal);
    if (ptr) {
      while (ptr && (paramEnCours < maxParam)) {
        Param[paramEnCours] = ptr;
        ptr = strtok(NULL, esperluette);
        if (ptr) {
          Value[paramEnCours] = ptr;
          decodeParam(paramEnCours);
          paramEnCours++;
        }
        else break;
        ptr = strtok(NULL, egal);
      }
    } else Serial.println(F("pas de signe ="));
  } else Serial.println(F("MAUVAIS DEBUT D'URL"));

  return paramEnCours;
}


void setup() {
  char conversionBuffer[32];

  Serial.begin(115200);

  Serial.print(F("Je decode: "));
  Serial.println(monURL);

  byte n = decodeURL();

  for (byte i = 0; i < n; i++) {
    Serial.print(i);
    Serial.print(F("\t["));
    Serial.print(Param[i]);
    Serial.print(F("] --> ["));
    Serial.print(Value[i]);
    Serial.print(F("] soit T = "));
    Serial.print(horaire[i]);
    itoa(horaire[i], conversionBuffer, 16); // base 16 = hexa
    Serial.print(F(" --> en Hexa 0x"));
    Serial.print(conversionBuffer);
    itoa(horaire[i], conversionBuffer, 2); // base 2 = binaire
    Serial.print(F(" , en binaire B"));
    Serial.print(conversionBuffer);
    itoa(horaire[i], conversionBuffer, 10); // base 10 = décimal
    Serial.print(F(" et en décimal "));
    Serial.println(conversionBuffer);
  }
}

void loop() {}


ça donne


Je decode: /?H1V1=01%3A10&P1V1=5&H1V2=10%3A10&P1V2=10&H2V1=01%3A20&P2V1=15&H2V2=10%3A20&P2V2=20&H3V1=01%3A30&P3V1=25&H3V2=10%3A30&P3V2=30&H4V1=01%3A40&P4V1=35&H4V2=10%3A40&P4V2=40&H5V1=01%3A50&P5V1=45&H5V2=10%3A50&P5V2=50&H6V1=02%3A00&P6V1=55&H6V2=11%3A00&P6V2=60&H7V1=02%3A10&P7V1=65&H7V2=11%3A10&P7V2=70&H8V1=02%3A20&P8V1=75&H8V2=11%3A20&P8V2=80
0 [H1V1] --> [01%3A10] soit T = 70 --> en Hexa 0x46 , en binaire B1000110 et en décimal 70
1 [P1V1] --> [5] soit T = 300 --> en Hexa 0x12c , en binaire B100101100 et en décimal 300
2 [H1V2] --> [10%3A10] soit T = 610 --> en Hexa 0x262 , en binaire B1001100010 et en décimal 610
3 [P1V2] --> [10] soit T = 600 --> en Hexa 0x258 , en binaire B1001011000 et en décimal 600
4 [H2V1] --> [01%3A20] soit T = 80 --> en Hexa 0x50 , en binaire B1010000 et en décimal 80
5 [P2V1] --> [15] soit T = 900 --> en Hexa 0x384 , en binaire B1110000100 et en décimal 900
6 [H2V2] --> [10%3A20] soit T = 620 --> en Hexa 0x26c , en binaire B1001101100 et en décimal 620
7 [P2V2] --> [20] soit T = 1200 --> en Hexa 0x4b0 , en binaire B10010110000 et en décimal 1200
8 [H3V1] --> [01%3A30] soit T = 90 --> en Hexa 0x5a , en binaire B1011010 et en décimal 90
9 [P3V1] --> [25] soit T = 1500 --> en Hexa 0x5dc , en binaire B10111011100 et en décimal 1500
10 [H3V2] --> [10%3A30] soit T = 630 --> en Hexa 0x276 , en binaire B1001110110 et en décimal 630
11 [P3V2] --> [30] soit T = 1800 --> en Hexa 0x708 , en binaire B11100001000 et en décimal 1800
12 [H4V1] --> [01%3A40] soit T = 100 --> en Hexa 0x64 , en binaire B1100100 et en décimal 100
13 [P4V1] --> [35] soit T = 2100 --> en Hexa 0x834 , en binaire B100000110100 et en décimal 2100
14 [H4V2] --> [10%3A40] soit T = 640 --> en Hexa 0x280 , en binaire B1010000000 et en décimal 640
15 [P4V2] --> [40] soit T = 2400 --> en Hexa 0x960 , en binaire B100101100000 et en décimal 2400
16 [H5V1] --> [01%3A50] soit T = 110 --> en Hexa 0x6e , en binaire B1101110 et en décimal 110
17 [P5V1] --> [45] soit T = 2700 --> en Hexa 0xa8c , en binaire B101010001100 et en décimal 2700
18 [H5V2] --> [10%3A50] soit T = 650 --> en Hexa 0x28a , en binaire B1010001010 et en décimal 650
19 [P5V2] --> [50] soit T = 3000 --> en Hexa 0xbb8 , en binaire B101110111000 et en décimal 3000
20 [H6V1] --> [02%3A00] soit T = 120 --> en Hexa 0x78 , en binaire B1111000 et en décimal 120
21 [P6V1] --> [55] soit T = 3300 --> en Hexa 0xce4 , en binaire B110011100100 et en décimal 3300
22 [H6V2] --> [11%3A00] soit T = 660 --> en Hexa 0x294 , en binaire B1010010100 et en décimal 660
23 [P6V2] --> [60] soit T = 3600 --> en Hexa 0xe10 , en binaire B111000010000 et en décimal 3600
24 [H7V1] --> [02%3A10] soit T = 130 --> en Hexa 0x82 , en binaire B10000010 et en décimal 130
25 [P7V1] --> [65] soit T = 3900 --> en Hexa 0xf3c , en binaire B111100111100 et en décimal 3900
26 [H7V2] --> [11%3A10] soit T = 670 --> en Hexa 0x29e , en binaire B1010011110 et en décimal 670
27 [P7V2] --> [70] soit T = 4200 --> en Hexa 0x1068 , en binaire B1000001101000 et en décimal 4200
28 [H8V1] --> [02%3A20] soit T = 140 --> en Hexa 0x8c , en binaire B10001100 et en décimal 140
29 [P8V1] --> [75] soit T = 4500 --> en Hexa 0x1194 , en binaire B1000110010100 et en décimal 4500



--> vous voyez comment on met un entier en format texte dans une certaine base.. Maintenant je ne sais pas pourquoi vous avez besoin de cela... la fonction print le fait pour vous...



Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

EricRecifal33480

Bonsoir

Merci je n'ai pas modifié beaucoup le code mais je ne comprend pas le comportement de celui ci

Je force les valeurs contenu d'une variables pour certaine valeur

Code: [Select]

char monURL[] = "/?H1V1=01%3A10&P1V1=5&H1V2=10%3A10&P1V2=10&H2V1=01%3A20&P2V1=15&H2V2=10%3A20&P2V2=20&H3V1=01%3A30&P3V1=25&H3V2=10%3A30&P3V2=30&H4V1=01%3A40&P4V1=35&H4V2=10%3A40&P4V2=40&H5V1=01%3A50&P5V1=45&H5V2=10%3A50&P5V2=50&H6V1=02%3A00&P6V1=55&H6V2=11%3A00&P6V2=60&H7V1=02%3A10&P7V1=65&H7V2=11%3A10&P7V2=70&H8V1=02%3A20&P8V1=75&H8V2=11%3A20&P8V2=80";

const byte maxParam = 30;
char *Param[maxParam];
char *Value[maxParam];
int horaire[maxParam];
byte nbParam;
byte paramEnCours = 0;
const char detect[] = "/?";
const byte longeurDetect = sizeof(detect) - 1;
const char egal[] = "=";
const char esperluette[] = "&";
const char deuxpoints[] = "%3A";
const byte longeurDeuxpoints = sizeof(deuxpoints) - 1;
char conversionBuffer[32];

boolean lireEntier(const char * message, int &data)
{
  boolean erreur = true;
  boolean negatif = false;

  size_t i = 0;

  if (message[0] == '-') {
    negatif = true;
    i++;
  }

  if ((message[i] >= '0') && (message[i] <= '9')) { // si c'est bien un chiffre
    data = 0; // on initialise notre valeur
    erreur = false; // on sait que la lecture retournera au moins queqlue chose de correct
    while ((message[i] >= '0') && (message[i] <= '9')) {
      data = data * 10 + (message[i++] - '0'); // on construit notre entier
    }
    if (negatif) data = -data;
  }
  return erreur;
}


// décode soit 'xxx%3Axxx' soit 'xxx'
boolean decodeParam(byte n)
{
   boolean erreur = true;
  int h = 0;
  int m = 0;
  char * ptrDeuxPoints = strstr(Value[n], deuxpoints); // http://www.cplusplus.com/reference/cstring/strstr/
  if (ptrDeuxPoints) { // on a trouvé 2 points
    erreur = lireEntier(Value[n], h);
    erreur |= lireEntier(ptrDeuxPoints + longeurDeuxpoints, m);
    if (!erreur) horaire[n] = 60 * h + m;
  } else {
    erreur = lireEntier(Value[n], h);
    if (!erreur) horaire[n] = 60 * h;
  }
  return erreur;
}



byte decodeURL()
{
 
  char *debutAnalyse;
  char *ptr;

  if (!strncmp(monURL, detect, longeurDetect)) { // commmence-t-on bien par detect ?

    debutAnalyse = monURL + longeurDetect; // si oui on va commencer à analyser après detect

    ptr = strtok(debutAnalyse, egal);
    if (ptr) {
      while (ptr && (paramEnCours < maxParam)) {
        Param[paramEnCours] = ptr;
        ptr = strtok(NULL, esperluette);
        if (ptr) {
          Value[paramEnCours] = ptr;
         
         
          decodeParam(paramEnCours);
                    paramEnCours++;
        }
        else break;
        ptr = strtok(NULL, egal);
      }
    } else Serial.println(F("pas de signe ="));
  } else Serial.println(F("MAUVAIS DEBUT D'URL"));





  return paramEnCours;
}


void setup() {

  Serial.begin(115200);

  Serial.print(F("Je decode: "));
  Serial.println(monURL);

  byte n = decodeURL();

 
for (byte i=0 ; i<n  ;i=i+2)
{
  Serial.print(F("["));
  Serial.print(Param[i]);
  Serial.print(F("] --> ["));
  Serial.print(Value[i]);
  Serial.print(F("] --> ["));
  Serial.print(horaire[i]);
  Serial.print(F("] --> ["));
  Serial.print(itoa(horaire[i], conversionBuffer, 16));
  Value[i]=itoa(horaire[i], conversionBuffer, 16);
  Serial.print(F("] --> ["));
  Serial.print(Value[i]);
  Serial.println(F("]"));
}

  for (byte i = 0; i < n; i++) {
   
    Serial.print(F("["));
    Serial.print(Param[i]);
    Serial.print(F("] --> ["));
    Serial.print(Value[i]);
    Serial.print(F("] --> ["));
    Serial.print("i=");
    Serial.print(F("] --> ["));
    Serial.print(i);
    Serial.println(F("]"));
  }
}

void loop() {}


dans la boucle ou je réaffecte des valeurs dans la variable j'ai le bon résultat
[H1V1] --> [01%3A10] --> [70] --> [46] --> [46]
[H1V2] --> [10%3A10] --> [610] --> [262] --> [262]
[H2V1] --> [01%3A20] --> [80] --> [50] --> [50]
[H2V2] --> [10%3A20] --> [620] --> [26c] --> [26c]
[H3V1] --> [01%3A30] --> [90] --> [5a] --> [5a]
[H3V2] --> [10%3A30] --> [630] --> [276] --> [276]
[H4V1] --> [01%3A40] --> [100] --> [64] --> [64]
[H4V2] --> [10%3A40] --> [640] --> [280] --> [280]
[H5V1] --> [01%3A50] --> [110] --> [6e] --> [6e]
[H5V2] --> [10%3A50] --> [650] --> [28a] --> [28a]
[H6V1] --> [02%3A00] --> [120] --> [78] --> [78]
[H6V2] --> [11%3A00] --> [660] --> [294] --> [294]
[H7V1] --> [02%3A10] --> [130] --> [82] --> [82]
[H7V2] --> [11%3A10] --> [670] --> [29e] --> [29e]
[H8V1] --> [02%3A20] --> [140] --> [8c] --> [8c]

mais quand je regarde toutes les valeurs de ces variables je n'ai plus du tout le même résultats. par exemple dans la première partie Value[0]=0x46 mais ci dessous cette même variable deviens 8c.

[H1V1] --> [8c] --> [i=] -->

[P1V1] --> [5] --> [i=] --> [1]
[H1V2] --> [8c] --> [i=] --> [2]
[P1V2] --> [10] --> [i=] --> [3]
[H2V1] --> [8c] --> [i=] --> [4]
[P2V1] --> [15] --> [i=] --> [5]
[H2V2] --> [8c] --> [i=] --> [6]
[P2V2] --> [20] --> [i=] --> [7]
[H3V1] --> [8c] --> [i=] --> [8]
[P3V1] --> [25] --> [i=] --> [9]
[H3V2] --> [8c] --> [i=] --> [10]
[P3V2] --> [30] --> [i=] --> [11]
[H4V1] --> [8c] --> [i=] --> [12]
[P4V1] --> [35] --> [i=] --> [13]
[H4V2] --> [8c] --> [i=] --> [14]
[P4V2] --> [40] --> [i=] --> [15]
[H5V1] --> [8c] --> [i=] --> [16]
[P5V1] --> [45] --> [i=] --> [17]
[H5V2] --> [8c] --> [i=] --> [18]
[P5V2] --> [50] --> [i=] --> [19]
[H6V1] --> [8c] --> [i=] --> [20]
[P6V1] --> [55] --> [i=] --> [21]
[H6V2] --> [8c] --> [i=] --> [22]
[P6V2] --> [60] --> [i=] --> [23]
[H7V1] --> [8c] --> [i=] --> [24]
[P7V1] --> [65] --> [i=] --> [25]
[H7V2] --> [8c] --> [i=] --> [26]
[P7V2] --> [70] --> [i=] --> [27]
[H8V1] --> [8c] --> [i=] --> [28]
[P8V1] --> [75] --> [i=] --> [29]

J-M-L

itoa() retourne un pointeur sur le début de la chaîne donc ceci
Code: [Select]
  Value[i]=itoa(horaire[i], conversionBuffer, 16);
n'a pas bcp de sens puisque vous stockez à chaque fois le pointeur vers conversionBuffer dont le contenu va changer à chaque appel à itoa()

Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

EricRecifal33480

#39
Sep 14, 2018, 06:56 am Last Edit: Sep 14, 2018, 07:18 am by EricRecifal33480
Comment se fait-il qu'entre deux boucles « For »  le contenu de la variable value[] bouge alors qu'il s'agit d'une variable tableau défini en variable globale
J'ai essayer de remplacer

Code: [Select]

Value[i]=itoa(horaire[i], conversionBuffer,16);


Par

Code: [Select]

itoa(horaire[i], conversionBuffer,16);
Value[i]=conversionBuffer


Le résultat est le même

fdufnews

#40
Sep 14, 2018, 08:28 am Last Edit: Sep 14, 2018, 08:30 am by fdufnews
Le nom d'un tableau est un pointeur donc conversionBuffer est un pointeur. Lorsque tu fais
Code: [Select]
Value[i]=conversionBuffer
tu stockes le pointeur dans le tableau pas la valeur contenu dans le buffer.
Si tu veux que la chaine de caractères passe dans Value il faut faire une copie.
Mais le plus simple serait encore de passer l'élément du tableau à itoa pour qu'elle charge directement le résultat dans la destination souhaitée.
Code: [Select]
itoa(horaire[i], &Value[i],16);

EricRecifal33480

Je manque vraiment de recul

J-M-L

#42
Sep 14, 2018, 09:22 am Last Edit: Sep 14, 2018, 11:05 am by J-M-L
CF #38
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

fdufnews

En relisant le fil je m'aperçois que la solution que j'ai proposée plus haut ne fonctionne pas car Value[] et un tableau de char* donc il ne dispose d'aucun stockage pour mémoriser la chaîne de caractères.

EricRecifal33480

Bonjour ou Bonsoir,

J'ai je pense réussi à me défaire de mon problème de variable...

N'ayant toujours pas reçu mon ESP8266, j'ai par contre reçu un gentil esp32. Donc pour m'occuper je me suis lancé à programmer dessus les mêmes fonctions que sur la commande AT. La vitesse de mise à jour de la page HTML est beaucoup plus rapide. Et je suis arrivé au resultat en pièce jointe


J'ai donc essayé d'avancer autant que je pouvais et là.... me suis retrouvé avec la même problématique sur la longueur de l'URL. Quand je sort le code
Code: [Select]

Serial.print(c); // if you want to see the HTTP request


, je voit l'URL suivante :

GET /?H1V1=10%3A00&P1V1=100&H1V2=00%3A00&P1V2=100&H2V1=10%3A00&P2V1=100&H2V2=00%3A00&P2V2=100&H3V1=10%3A00&P3V1=100&H3V2=00%3A00&P3V2=100&H4V1=&P4V1=&H4V2=&P4V2=&H5V1=&P5V1=&H5V2=&P5V2=&H6V1=&P6V1=&H6V2=&P6V2=&H7V1=&P7V1=&H7V2=&P7V2=&H8V1=&P8V1=&H8V2=&P8V2= HTTP/1.1


Donc celle ci est complète  :o, alors que la variable "urlCommand" à la valeur suivante :

?H1V1=10%3A00&P1V1=100&H1V2=00%3A00&P1V2=100&H2V1=10%3A00&P2V1=100&H2V2=00%3A00&P2V2=100


httpHeaderIndex s'arrête d'incrémenter à 94


J'imagine que quelques choses cloche dans le code
Code: [Select]

void handleClient()
{
  boolean urlCommandFound = false;
  char httpHeader[MaxCommand + 1];
  byte httpHeaderIndex = 0;
  httpHeader[0] = '\0';
  urlCommand[0] = '\0';

  WiFiClient client = server.available();     // listen for incoming clients

  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
       
       
        //Serial.print(c); // if you want to see the HTTP request
       
       
        if (!urlCommandFound) {
          httpHeader[httpHeaderIndex++] = c;
          httpHeader[httpHeaderIndex] = '\0';
          if (httpHeaderIndex > MaxCommand - 1) httpHeaderIndex = MaxCommand - 1;
        }

        if (c == '\n' && currentLineIsBlank) {  // an http request ends with a blank line
          handleCommand(client);
          delay(5); // give the web browser time to receive the data
          client.stop(); // close the connection:
          break;
        }

        if (c == '\n') {
          currentLineIsBlank = true; // starting a new line
          if (!strncmp("GET / ", httpHeader, 5)) {   
            strcpy(urlCommand, (httpHeader + 5)); // get rid of the "GET / "
            char * firstSpacePtr = strchr(urlCommand, ' ');
            Serial.print("TOTO");
            Serial.println(firstSpacePtr);
            Serial.print("TATA");
            if (firstSpacePtr) *firstSpacePtr = '\0'; // get rid of the " HTTP / 1.1 etc
            urlCommandFound = true;
          } else {
            httpHeaderIndex = 0;
            httpHeader[0] = '\0';
          }
        } else if (c != '\r') {
          currentLineIsBlank = false; // new character on the current line, ignore '\r'
        }
      }
    }
  }
}


Avez vous des pistes à me donner ?


Go Up