Arduino-Ethernet - Réponses bizarres

Bonjour,

Je me permets de faire appel a vous car j'ai un souci que je n'arrive pas a comprendre.

En effet, je m'amuse actuellement avec une carte arduino avec une shield ethernet.

J'ai donc un petit code sur un blog qui permet de faire des interactions entre une page HTML et l'arduino (avec JSON).
Le code me semble bon et pourtant.

Dans le sens html->arduino, ça fonctionne et mes leds s'allument.
En revanche, le retour de l'arduino+ethernet est complètement déformé (voir les codes ci-dessous).

J'ai l'impression que le problème provient plus de la mémoire ou du fonctionnement que du code.

Avez vous une idée ?

Merci.

Code de réponse de l'arduino :

void repondre(EthernetClient client) {
  // La fonction prend un client en argument
  //Serial.println(freeMemory());
  Serial.println("\nRepondre"); // debug
  // On fait notre en-tête
  // Tout d'abord le code de réponse 200 = réussite
  client.println("HTTP/1.1 200 OK");
  // Puis le type mime du contenu renvoyé, du json
  client.println("Content-Type: application/json");
  // Autorise le cross origin
  client.println("Access-Control-Allow-Origin: *");
  // Et c'est tout !
  // On envoi une ligne vide pour signaler la fin du header
  client.println();
 
  // Puis on commence notre JSON par une accolade ouvrante
  client.println("{");
  // On envoie la première clé : "uptime"
  client.print("\t\"uptime\": 1234");
  // Puis la valeur de l'uptime
  //client.print(millis());
  //Une petite virgule pour séparer les deux clés
  client.println(",");
  // Et on envoie la seconde nommée "analog 0"
  client.print("\t\"A0\": 0");
  //Serial.println("1000"); // debug
  //client.print(analogRead(A0));
  client.println(",");
  // Puis la valeur de la PWM sur la broche 6
  client.print("\t\"pwm\": 0");
  //client.print(pwm, DEC);
  client.println(",");
  // Dernières valeurs, les broches (elles mêmes dans un tableau)
  client.println("\t\"broches\": {");
  // La broche 3
  client.print("\t\t\"3\": 0");
  //client.print(digitalRead(7));
  client.println(",");
  // La broche 4
  client.print("\t\t\"4\": 0");
  //client.print(digitalRead(7));
  client.println(",");
  // La broche 5
  client.print("\t\t\"5\": 0");
  //client.println(digitalRead(7));
  client.println("\t}");
  // Et enfin on termine notre JSON par une accolade fermante
  client.println("}");
}

Réponse reçue :

{
ET /?b=3,4,5&p=191 HTTP/1.1
 pwm": 091 HTTP/1.1
 pwm": 0
 HTTP/1.1
 pwm": 091 HTTP/1.1
 pwm": 0

 pwm": 091 HTTP/1.1
 pwm": 0
	"broches": {
		"3": 091 HTTP/1.1
 pwm": 0
		"4": 091 HTTP/1.1
 pwm": 0
		"5": 0	}
}

Compil :

Le croquis utilise 17 584 octets (54%) de l'espace de stockage de programmes. Le maximum est de 32 256 octets.
Les variables globales utilisent 683 octets (33%) de mémoire dynamique, ce qui laisse 1 365 octets pour les variables locales. Le maximum est de 2 048 octets.

bonjour,
déjà tu as deux { ouvrantes pour une } fermante dans ton json

en théorie le format json est le suivant

{ 
  "menu": "Fichier", 
  "commandes": [ 
      {
          "titre": "Nouveau", 
          "action":"CreateDoc"
      }, 
      {
          "titre": "Ouvrir", 
          "action": "OpenDoc"
      }, 
      {
          "titre": "Fermer",
          "action": "CloseDoc"
      }
   ] 
}

Bonjour infobarquee,

Merci pour ton retour.

Cependant, je vois bien 2 "}" (2 dernières instructions)

Histoire de vérifier, j'ai doublé toutes les instructions client.* avec des Serial.* histoire de voir résultat dans la console.
Et bien la console rend exactement le même résultat.

Console :

HTTP/1.1 200 OK
Content-Type: application/json

{
	"uptime": 1234,GET /?b=3,4,5&p=191 HTTP/1.1
 : {
ET /?b=3,4,5&p=191 HTTP/1.1
 : {,GET /?b=3,4,5&p=191 HTTP/1.1
 : {
4,5&p=191 HTTP/1.1
 : {,GET /?b=3,4,5&p=191 HTTP/1.1
 : {
HTTP/1.1
 : {
		"3": 0,GET /?b=3,4,5&p=191 HTTP/1.1
 : {
		"4": 0,GET /?b=3,4,5&p=191 HTTP/1.1
 : {
		"5": 0	}
}

Je penses que le résultat attendu est du genre :

HTTP/1.1 200 OK
Content-Type: application/json

{
	"uptime": 1234,
        "A0":0,
        "pwm":0,
        "broches": {
             "3": 0,
	     "4": 0,
	     "5": 0
        }
}

Bon, je pense que le problème est lié à l'utilisation de la mémoire.

Dans un premier temps, j'ai testé en n'alimentant plus ma chaine avec url[index]=car et allouée avec char *url = (char *)malloc(100);
C'etait beacoup mieux mais il restait une petite erreur dans le JSON.

J'ai donc ensuite ajouter des F("ma chaine") dans mes print et ça fonctionne.

la donnée url sert a stocker chaque caractère lu.

Pouvez vous me donner la bonne marche suivre pour utiliser la donnée url
(a defaut de mieux, il faudra que je traite les caractères à la lecture sans les stocker)