erreur code transmission données serveur web

Bonjour , j ’ ai modifier un code afin de gerer plusieurs relais par interface web a distance .

Tout se passe bien sauf quand je clique sur un lien pour changer l ’ etat d’ un relais …

Je suis un mega2560+shield wiznet 5500 .

A ce niveau la je seche grandement , bien que je suspecte la fonction GET , voici mon code complet :

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet2.h> //bibliothèque pour Ethernet
#include <SD.h> //bibliothèque pour carte micro-SD

byte mac[] = {0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx}; //adresse mac de votre carte
byte ip[] = {192, 168, x, xxx}; //adresse IP
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
const int nombre_De_Relais = 18;
const int pinRelaisDebut = 3; //variable de pin pour le 1er Relais , les autres s' incrementent.
int tableau_Pin_Relais [nombre_De_Relais];
boolean tableau_Etat_Relais [nombre_De_Relais];
int numero_Relais = 1000; // variable non numerique pour verif .///////////////////////////////////////////////////////////////////////////////////
EthernetServer serveur(80); // déclare l'objet serveur au port d'écoute 80

void setup() {
  Serial.begin (9600); //initialisation de communication série
///////////////////////////////////////////////////////////////////////////////////////
  for ( int i = 0; i < nombre_De_Relais; i++ ) {
    tableau_Etat_Relais [i] = 0; //initialisation de tous les relais en mode 0 V .
    tableau_Pin_Relais [i] = (i+pinRelaisDebut); //variable de pin pour les Relais .
    pinMode((tableau_Pin_Relais [i]), OUTPUT); //pin en mode OUTPUT
    Serial.println("Relais N° " + String (i) + " initialisé sur le pin N° " + String(tableau_Pin_Relais [i]) );
    
  }
//////////////////////////////////////////////////////////////////////////////////////
  Ethernet.begin (mac, ip); //initialisation de la communication Ethernet
  Serial.print("*\n-> Le serveur est sur l'adresse : ");
  Serial.println(Ethernet.localIP()); //on affiche l'adresse IP de la connexion
  serveur.begin(); // démarre l'écoute
}

void loop() {
  gestionClient(); // fonction qui gère toute la communication avec le client
}

//----------------------Fonctions----------------------
//fonction qui gère la communication avec le client
void gestionClient() {
  EthernetClient client = serveur.available(); //on écoute le port
  if (client) { //si client existe
    Serial.println("Client en ligne"); //on le dit...
    if (client.connected()) { // si le client est connecté
      GET(client); //appel de la fonction de décodage
      //réponse au client
      entete(client); // fonction pour l'entête de la page HTML
      corps(client); // fonction pour le corps
      piedPage(client); // fonction pour le pied de page
      Serial.println("Fin de communication avec le client\n");
      client.stop(); //on déconnecte le client
    } // fin client connecte
  } // fin client existant
} // fin fonction gestionClient

//fonction de fabrication de l'entête HTML
void entete(EthernetClient cl) {
  //infos pour le navigateur
  cl.println("HTTP/1.1 200 OK"); // type du HTML
  cl.println("Content-Type: text/html; charset=ascii"); //type de fichier et encodage des caractères
  cl.println("Connection: close");  // fermeture de la connexion quand toute la réponse sera envoyée
  cl.println();
  //balises d'entête
  cl.println("<!DOCTYPE HTML>");
  cl.println("<html>");
  cl.println("<head><title>Relais</title></head>");
  cl.println("<body><h1>Relais</h1><hr>
");
}

//fonction de fabrication du corps de page
void corps(EthernetClient cl) {
  for ( int i = 0; i < nombre_De_Relais; i++ ) {
    cl.println("
Relais numero " + String(i) + " <a href=?r" + String(i) + " target=_self >");
    if (tableau_Etat_Relais [i]) { //si état sur 1
      cl.print("ON "); // on l'écrit
    }
    else { // sinon
      cl.print("OFF "); //on l'écrit aussi
    }
    cl.println("</a>");//fin du lien
  } // fin de boucle .
}

//fonction de fabrication du pied de page
void piedPage(EthernetClient cl) {
  //balises de pied de page
  cl.println("
<hr></body></html>");
}

// fonction pour gerer les pin relais sortie etc .
void gestionRelais(int numero_Relais) {
  for ( int i=0; i<nombre_De_Relais; i++ ) {    
    if ( tableau_Etat_Relais[i] == numero_Relais ) {
        tableau_Etat_Relais[i] = !tableau_Etat_Relais[i]; //on change l'état du relais
          digitalWrite(tableau_Pin_Relais[i], tableau_Etat_Relais[i]); //on met à jour le pin
          Serial.println(tableau_Etat_Relais[i]);  // verification sortie serie .
    }
  }
}

//fonction décodage GET
void GET(EthernetClient cl) {
  boolean lu = 0; //variable pour indiquer l'état de lecture
  while (cl.available()) { // tant qu'il y a des infos à transmettre
    char c = cl.read(); // on lit le caractère
    delay(1); //delai de lecture
    if (c == '?' && lu == 0) { //si "?" repéré
    c = cl.read(); //on lit le caractère suivant qui contient la donnée
      if (c == 'r') { //si code reçu
      
      int numero_Relais =  cl.read(); //on lit le caractère suivant
      delay(1); //delai de lecture
      if ( (isAlphaNumeric(numero_Relais)) && (numero_Relais >= 0) && (numero_Relais < nombre_De_Relais) ) {
        gestionRelais(numero_Relais);
      }
    }
      lu = 1; // on dit qu'on a lu l'info
    }
  } // fin de while lecture des infos .
}

j ’ ai apporté des modifications afin de trouver exactement d’ ou vient le probleme et avoir une debug plus precis .

J ’ ai bien trouvé quel est le probleme , mais je ne sais pas comment le corriger , je dois zapper un truc .

De plus pour ceux qui font du serveur web un conseil , prenez 3 a 4 navigateurs pour faire vos essais …

voici le code et un commentaire specifique a l’ endoit ou ca ne va pas , si certains ont deja eu le cas .

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet2.h> //bibliothèque pour Ethernet
#include <SD.h> //bibliothèque pour carte micro-SD

byte mac[] = {0x90, 0xA2, 0xDA, 0x10, 0x2F, 0x93}; //adresse mac de votre carte
byte ip[] = {192, 168, 1, 125}; //adresse IP
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
const int nombre_De_Relais = 18;
const int pinRelaisDebut = 3; //variable de pin pour le 1er Relais , les autres s' incrementent.
int tableau_Pin_Relais [nombre_De_Relais];
boolean tableau_Etat_Relais [nombre_De_Relais];
char debug ='a'; // a : active le debug , d : desactive le debug
///////////////////////////////////////////////////////////////////////////////////
EthernetServer serveur(80); // déclare l'objet serveur au port d'écoute 80

void setup() {
  Serial.begin (9600); //initialisation de communication série
///////////////////////////////////////////////////////////////////////////////////////
  for ( int i = 0; i < nombre_De_Relais; i++ ) {
    tableau_Etat_Relais [i] = 0; //initialisation de tous les relais en mode 0 V .
    tableau_Pin_Relais [i] = (i+pinRelaisDebut); //variable de pin pour les Relais .
    pinMode((tableau_Pin_Relais [i]), OUTPUT); //pin en mode OUTPUT
    Serial.println("Relais N° " + String (i) + " initialisé sur le pin N° " + String(tableau_Pin_Relais [i]) );
    
  }
//////////////////////////////////////////////////////////////////////////////////////
  Ethernet.begin (mac, ip); //initialisation de la communication Ethernet
  Serial.print("*\n-> Le serveur est sur l'adresse : ");
  Serial.println(Ethernet.localIP()); //on affiche l'adresse IP de la connexion
  serveur.begin(); // démarre l'écoute
}

void loop() {
  gestionClient(); // fonction qui gère toute la communication avec le client
}

//----------------------Fonctions----------------------
//fonction qui gère la communication avec le client
void gestionClient() {
  EthernetClient client = serveur.available(); //on écoute le port
  if (client) { //si client existe
    Serial.println("Client en ligne"); //on le dit...
    if (client.connected()) { // si le client est connecté
      GET(client); //appel de la fonction de décodage
      //réponse au client
      entete(client); // fonction pour l'entête de la page HTML
      corps(client); // fonction pour le corps
      piedPage(client); // fonction pour le pied de page
      Serial.println("Fin de communication avec le client\n");
      client.stop(); //on déconnecte le client
    } // fin client connecte
  } // fin client existant
} // fin fonction gestionClient

//fonction de fabrication de l'entête HTML
void entete(EthernetClient cl) {
 if (debug=='a') {
 Serial.println("entree fonction entete");
 }
  //infos pour le navigateur
  cl.println("HTTP/1.1 200 OK"); // type du HTML
  cl.println("Content-Type: text/html; charset=ascii"); //type de fichier et encodage des caractères
  cl.println("Connection: close");  // fermeture de la connexion quand toute la réponse sera envoyée
  cl.println();
  //balises d'entête
  cl.println("<!DOCTYPE HTML>");
  cl.println("<html>");
  cl.println("<head><title>Relais</title></head>");
  cl.println("<body><h1>Relais</h1><hr>
");
}

//fonction de fabrication du pied de page
void piedPage(EthernetClient cl) {
 if (debug=='a') {
 Serial.println("entree fonction piedPage");
 }
  //balises de pied de page
  cl.println("
<hr></body></html>");
}

// fonction pour gerer les pin relais sortie etc .
void gestionRelais(int numero_Relais) {
 if (debug=='a') {
 Serial.println("entree fonction gestionRelais");
 }
  for ( int i=0; i<nombre_De_Relais; i++ ) {    
    if ( tableau_Etat_Relais[i] == numero_Relais ) {
        tableau_Etat_Relais[i] = !tableau_Etat_Relais[i]; //on change l'état du relais
          digitalWrite(tableau_Pin_Relais[i], tableau_Etat_Relais[i]); //on met à jour le pin
          Serial.println(tableau_Etat_Relais[i]);  // verification sortie serie .
    }
  }
}

//fonction décodage GET
void GET(EthernetClient cl) {
 if (debug=='a') {
 Serial.println("entree fonction GET");
 }
   int lu = 0; //variable pour indiquer l'état de lecture
 String message ="";
 String readString = String();
 
 
 //while (cl.available()) { // tant qu'il y a des infos à transmettre
 //while ( lu == 0 ){ // tant qu'il y a des infos à transmettre
 //if (cl.available()) {
 for (int i=0; i<10 && (cl.available()); i++) {
    char c = cl.read(); // on lit le caractère
     delay(1); //delai de lecture
 Serial.println(c);
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
     if (c == '?' && lu == 0) { //si "?" repéré  GROS PROBLEME pour recuperer le numero de relais .
     char code = cl.read(); //on lit le caractère suivant qui contient la donnée
 if (readString.length() < 3) {
 readString.concat(code);
 }
 delay(1); //delai de lecture
 Serial.println(code);
 Serial.println(readString);
 //Serial.write(code);
 
 
 if (code == 'r') { //si code reçu
 if (debug=='a') {
 Serial.println("code r pour relais recu");
 }
 
 int numero_Relais =  cl.read(); //on lit le caractère suivant
 delay(1); //delai de lecture
 if ( (isAlphaNumeric(numero_Relais)) && (numero_Relais >= 0) && (numero_Relais < nombre_De_Relais) ) {
 Serial.println("numero de relais =" + String(numero_Relais));
 Serial.println("YES !!!!!!!!!!!");
         gestionRelais(numero_Relais);
 message = "info lu avec succes" ;
 if (debug=='a') {
 Serial.println("numero de relais recu");
 }
 }
 else {
 message = "info partielle , numero de relais manquant" ;
 }
 }
 else {
 message = "info erronee" ;
 }
 }
 else {
 message="aucun envoi de données";
 }
 } // fin de while lecture des infos .
 lu = 1; // on dit qu'on a lu l'info
 Serial.println(message);
//}
}
//fonction de fabrication du corps de page
void corps(EthernetClient cl) {
 if (debug=='a') {
 Serial.println("entree fonction corps");
 }
  for ( int i = 0; i < nombre_De_Relais; i++ ) {
    cl.println("
Relais numero " + String(i) + " <a href=?r" + String(i) + " target=_self >");
    if (tableau_Etat_Relais [i]) { //si état sur 1
      cl.print("ON "); // on l'écrit
    }
    else { // sinon
      cl.print("OFF "); //on l'écrit aussi
    }
    cl.println("</a>");//fin du lien
  } // fin de boucle .
}

merci de votre attention .