Show Posts
Pages: [1]
1  International / Français / Re: Question a deux balles on: June 21, 2011, 06:01:16 am
Pour la première question, tu veux écrire dans la liaison série "0x02b" tel quel ou bien le caractère ascii correspondant ("+") ?
Si tu veux écrire 0x02b utilise simplement les guillemets pour écrire la chaîne de caractères,
si c'est pour écrire '+', écrit directement la donnée en binaire avec Serial.write().

En revanche si c'est pour écrire le contenu d'une variable en hexadécimal comme pour la deuxième question, c'est effectivement Serial.print(x, HEX) qu'il faut utiliser.

À mon avis s'il écrit six 'F' devant c'est à cause du type de la variable, un hexadécimal sur deux caractères est un octet, essaie avec Serial.print((byte)x, HEX).

Sinon tu peux aller voir du côté des fonctions de formatage qui permettent une meilleur maîtrise de l'affichage des chaînes, mais qui sont plus complexes (et en plus je ne sais pas du tout comment elles se comportent avec l'arduino).

http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html

Si tu utilises ces fonctions, je crois qu'il faudra plutôt passer par une chaine  temporaire en utilisant sprintf car elles ne permettent pas d'écrire directement dans la liaison série.
2  International / Français / Re: Problème Ethernet Shield HTTP on: June 16, 2011, 04:37:30 pm
Me revoici avec mes conclusions si ça peut aider quelqu'un...

J'ai repris la fonction pour faire l'attente de réponse et les lectures dans une seule boucle, comme suit :

Code:
while (client.connected())
{
    if (client.available())
    {
        //test si entetes déjà passées, si c'est le cas remplissage du tampon
    }

    if (timeout) erreur;
}
Apparemment cela règle le problème de dépassement lors de la réception.


Et il a fallu également pour résoudre le problème de GET anarchique remplacer :
Code:
client.println("GET ... HTTP/1.0");
client.println();
par :
Code:
client.print("GET ... HTTP/1.0\r\n\r\n");

Là en revanche je n'ai pas compris pourquoi puisque le println ne fait rien d'autre qu'ajouter "\r\n".


Voilà tout, merci et bonne soirée.
3  International / Français / Re: Problème Ethernet Shield HTTP on: June 15, 2011, 07:49:14 am
Pourtant je fais tout dans la même fonction, ma fonction de récupération HTTP actuelle est conçue selon le schéma suivant :

Code:
if (!client.connect()) return erreur;

client.println("GET /magepage?mesvariables HTTP/1.0");
client.println();

while (!client.available())
{
    delay(10);
    if (!client.connected() || test timeout)
    {
         client.stop();
         return erreur;
    }
}

while (client.connected())
{
    if (client.available()) client.read();
    else if (test timeout)
    {
        client.stop();
        return erreur;
    }
}

client.stop();
return ok;

Et oui pour l'instant le serveur est sur mon PC et l'arduino y accède depuis le réseau local.
4  International / Français / Re: Problème Ethernet Shield HTTP on: June 15, 2011, 05:17:14 am
Bon, même avec le code simplifié je fini par planter (cette fois après quelques minutes de réussite pour une page par seconde tout de même).
Je dois pouvoir laisser l'arduino fonctionner sans avoir à le redémarrer manuellement, si encore je pouvais réinitialiser totalement le W5100 quand ça plante pour que ça reprenne correctement, ça me conviendrait, mais je ne vois pas.

Je viens de regarder du côté de wireshark,  les requêtes GET sont toujours erronées lorsque ça plante, mais cela signifie que le buffer d'émission dépasse et pas celui de reception ?

Est-il possible que le buffer de réception déborde sur celui d'émission ? je croyais qu'il s'agissait de buffers circulaires.

Le premier plantage cette fois commence toujours par une déconnexion pendant l'attente de réponse.
5  International / Français / Re: EThernet Shield: temps de réponse on: June 15, 2011, 04:00:51 am
Merci je vais voir cela, ça me paraît cohérent qu'il s'agisse d'un problème de buffer d'après les erreurs que j'ai.

Je vais tenter de réduire le nombre max de connexions de 4 à 1 dans la librairie et augmenter le buffer à 8ko puisque je suis certain de n'utiliser qu'une seule connexion simultanée dans tout le programme.
6  International / Français / Re: Problème Ethernet Shield HTTP on: June 15, 2011, 02:34:40 am
Bonmatin à vous,

j'ai essayé votre code, pas de problème, je l'ai modifié pour récupérer la page en boucle, pas de problème non plus. j'ai donc repris mon code après l'avoir vidé (j'avais 20ko d'autres choses) pour ne laisser que ma fonction de récupération HTTP avec un appel dans loop(), ça fonctionne...

Pourtant dans le reste du code je ne touche pas au réseau, étrange.
Peut-être est-ce le LCD qui est en route ? Mais il ne prend pas de ports utilisées par le shield normalement, il est connecté sur les pins 2, 3, 4, 5, 8 et 9.

Petite précision : si je remet le code qui plante dans l'arduino, que j'attends le premier plantage après 4 ou 5 connexions, et qu'après avoir planté je reprogramme l'arduino avec votre code, cela plante toujours, même avec un reset, il faut que je débranche et rebranche l'usb pour que ça reprenne correctement.
7  International / Français / Re: Problème Ethernet Shield HTTP on: June 14, 2011, 09:47:37 am
Après actualisation de la fonction pour enregistrer le contenu de la réponse dans un buffer, j'ai 4 connexions qui se passent sans problème puis j'ai à nouveau le problème de la boucle sur les deux caracères "-e" de l'entete Cache-control (souvent précédé d'une erreur de déconnexion pendant l'attente du serveur).

Avec wireshark, la requête get semble bonne la plupart du temps, mais quelque fois le module envoie des requête erronées (caractères spéciaux qui apparaissent).

La première erreur de boucle est souvent précédée d'un "DUP ACK" de la part de l'aduino.


8  International / Français / Re: Problème Ethernet Shield HTTP on: June 14, 2011, 08:36:59 am
Je retire ma question pour le point d'exclamation avant le HTTP, j'avais mis le serial.print() avant le client.read() (et en plus j'avais corrigé cette erreur en postant le code dans le forum smiley-roll)...

Et je précise que si j'utilise ce système de lecture des données après la fonction connexion c'est pour lire ligne par ligne des pages Web éventuellement grosse sans allouer un buffer de 1000 octets ; cela dit je crois que je vais le faire tout de même puisque j'ai suffisamment de ram disponible.

9  International / Français / Re: Problème Ethernet Shield HTTP on: June 14, 2011, 08:19:54 am
Pour être tordu ça l'est c'est vrai...

À vrai dire c'est le troisième bout de code servant à faire la même chose que j'écris, mais de toute évidence dans chacun de mes codes il y a le même genre d'erreur.

Le serveur auquel j'accède avec la requête GET est un Apache.

Voici une copie des Serial.print lorsque ça marche :

Code:
libre : 4862
att.ok
Entetes...!HTTP/1.1 200 OK
Date: Tue, 14 Jun 2011 12:37:07 GMT
Server: Apache/2.2.17 (Ubuntu)
X-Powered-By: PHP/5.3.5-1ubuntu7.2
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 20
Connection: close
Content-Type: text/html

Et en voilà une autre quand ça plante :
Code:
libre : 5057
att.Erreur 30
 libre : 5057
att.Erreur 30
 libre : 5057
att.Erreur 30
 libre : 5057
att.Erreur 30
 libre : 5057
att.Erreur 30
 libre : 5057
att.ok
Entetes...!HTTP/1.1 200 OK
Date: Tue, 14 Jun 2011 12:37:54 GMT
Server: Apache/2.2.17 (Ubuntu)
X-Powered-By: PHP/5.3.5-1ubuntu7.2
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cachee-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-(plein de "-e-")Erreur 39
reinit reseau
ok
 libre : 5057
att.ok
Entetes...!HTTP/1.1 200 OK
Date: Tue, 14 Jun 2011 12:38:18 GMT
Server: Apache/2.2.17 (Ubuntu)
X-Powered-By: PHP/5.3.5-1ubuntu7.2
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cachee-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e...Erreur 39
reinit reseau
ok

Et le résultat est complètement aléatoire (varie entre les erreur de déconnexion et les caractères en boucle, et parfois une requête qui passe correctement) dès que ça a planté.

Sinon je me demande aussi d'où sort le point d'exclamation avant la réponse (!HTTP/1.1 200 OK)

Avec wireshark je vois des belles requetes HTTP telle que

GET /mapage HTTP/1.0
[
ack
continuations or non-http,
parfois TCP port reused
            TCP windows update
            1028 > http [RST]
]
HTTP/1.1 200 ok (text/html)

Mais quand ça se met à planter le module envoie un peu n'importe quoi :

GET /mapageET /mapageGET /mapage HTTP/1.0\r\n

Et là le serveur renvoie des 400 Bad Request.

Je vais remettre un autre code pour retrouver les erreurs sur des fonctions plus simplement codées...

10  International / Français / Re: Problème Ethernet Shield HTTP on: June 14, 2011, 05:05:57 am
Bon, j'ai rajouté des delay() un peu partout, j'ai maintenant 4 ou 5 connexions qui s'effectuent correctement avant de planter et j'ai des erreurs de déconnexion (erreur 30 pendant l'attente du serveur).

Une idée ? je suppose que les délais améliorent les choses pour les tampons de réception mais je ne vais pas mettre un délai de 2 seconde à chaque fois que j'utilise l'objet client...
11  International / Français / Re: Problème Ethernet Shield HTTP on: June 13, 2011, 06:56:56 am
Merci pour cette réponse rapide.

J'avais déjà regardé ce topic, je suis quasiment sûr de ne pas avoir de problème de mémoire vive car en utilisant une fonction de test de ram disponible, je vois que j'ai à chaque connexion quasiment 5ko.

Normalement je n'ai pas de problème de synchronisation avec le serveur car j'utilise une boucle d'attente de réponse.
Pas de problème non plus de la connexion précédente mal fermée, j'utilise HTTP/1.0 (pas de connexion persistante) et je vérifie à chaque connexion que la connexion précédente est bien fermée.

Enfin en gros je sèche...

voilà le code de ma fonction de connexion qui envoie la requête et lit les en-têtes de manière à laisser l'objet client prêt à lire le contenu de la page :

Code:
/* Connexion et envoi requete GET */
/* Retour : true si erreur */
bool connexion(char *adresse_connexion)
{
        Serial.print(" libre : ");
        Serial.println(memoryTest());
        deconnexionClient();
       
        if (client.connect())
        {
                delay(100);
                client.print("GET /");
                client.print(adresse_connexion);
                client.println(" HTTP/1.0");
                client.println();
               
                //attente serveur
                Serial.print("att.");
                unsigned long debut_tentative = millis();
                while (client.available() == 0)
                {
                        delay(10);
                        if (!client.connected())
                        {
                        erreur(30);
                        client.stop();
                        return true;
                        }
else if ((millis() - debut_tentative) > TIMEOUT)
{
erreur(35);
return true;
}
                }
                Serial.println("ok");
               
                //passage entetes
                char carac;
                bool clrf = false;
                debut_tentative = millis();
                Serial.println("Entetes...");
                while (true)
                {
                if ((millis() - debut_tentative) > LONG_TIMEOUT)
{
erreur(39);
                                reinitShield();
return true;
}
               
                        if (client.available())
                {
        carac = client.read();
                                Serial.print(carac);
        if (carac == '\n')
        {
        //si deux retours à la ligne de suite lus, entetes passés
        if (clrf) break;
        else clrf = true;
        }
        else if (carac != '\r') clrf = false;
                }
                        else if ((millis() - debut_tentative) > TIMEOUT)
{
erreur(36);
return true;
}
                else if (!client.connected())
                {
                erreur(30);
                return true;
                }
                }
                Serial.println("ok");
                return false;
        }
        else
        {
                erreur(36);
                return true;
        }
}

//s'assurer que la connexion est fermée
void deconnexionClient()
{
        while (client.connected()) client.flush();
        client.stop();
}

//réinitialisation de l'ethernet shield
void reinitShield()
{
        client.stop();
        Serial.println("reinit reseau");
        delay(1000);
        Ethernet.begin(mac, ip, gateway, subnet);
        delay(1000);
        Serial.println("ok");
}

(je numérote les erreurs pour économiser de la mémoire)
12  International / Français / Problème Ethernet Shield HTTP on: June 13, 2011, 04:52:12 am
Bonjour à tous,

je dispose d'un Arduino Mega 2560 connecté à un Ethernet Shield.

Je souhaite récupérer quelques informations sur un serveur Web, pour cela je me connecte au serveur avec un client.connect()
puis après l'envoi de la requête GET, je récupère les informations qui m'intéressent avec des client.read().

Seulement voilà, dès la deuxième connexion, en plein milieu de la réception des en-têtes, l'ethernet shield me donne le même caractère en boucle.

Exemple :

HTTP/1.1 200 OK
...
Connection: close
Cacheeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee...

S'agit-il d'un problème de programmation récurrent, ou encore d'un problème avec la librairie Ethernet ?

J'ai tenté de stopper la connexion lors de la réception après un délais trop important, réinitialiser le shield avec un Ethernet.begin et reconnecter pour demander la même page ; le même problème se reproduit sur le même caractère.

Y a-t-il besoin de vider un buffer de réception ?


Merci.
Pages: [1]