2011-09-15 5 views
5

J'utilise un Arduino Uno avec Ethernet Shield.La connexion du client Ethernet Arduino (Uno) échoue après plusieurs impressions du client

Après l'envoi de nombreuses requêtes HTTP, client.println (...), le client commence à échouer lors de la connexion. Le délai d'échec semble être aléatoire, et la lecture de la séquence de la boucle peut varier entre ~ 1000 et ~ 7000.

L'erreur est de ne pas faire avec le débordement Ethernet de transmission tampon (à la suite this advice)

Voici le code qui échoue:

#include <Ethernet.h> 
#include <SPI.h> 

// Network constants 
byte mac[] = {0x00, 0x23, 0xdf, 0x82, 0xd4, 0x01}; 
byte ip[] = {/*REDACTED*/}; 
byte server[] = {/*REDACTED*/}; 
int port = /*REDACTED*/; 
Client client(server, port); 

// State 
int sequence; 

void setup(){ 
    Ethernet.begin(mac, ip); 
    Serial.begin(9600); 
    sequence = 0; 

    delay(1000); 
} 

void loop(){ 
    httpPut("/topic/:test/publish?sessionId=SESenanhygrp"); 
    Serial.println(sequence++); 
} 

void httpPut(char* url){ 
    if (!client.connect()) { 
     Serial.println("EXCEPTION: during HTTP PUT. Could not connect"); 
     return; 
    } 

    client.print("PUT"); 
    client.print(" "); 
    client.print(url); 
    client.println(" HTTP/1.0"); 
    client.println(); 

    while(!client.available()){ 
     delay(1); 
    } 

    while(client.available()) { 
     char c = client.read(); 
     Serial.print(c); 
    } 

    while(client.connected()){ 
     Serial.println("Waiting for server to disconnect"); 
    } 

    client.stop(); 
} 

L'erreur se produit dans le segment suivant

if (!client.connect()) { 
    Serial.println("EXCEPTION: during HTTP PUT. Could not connect"); 
    return; 
} 
+0

Au moment où le client ne parvient pas à se connecter, je ferais deux choses: (1) vérifier les logs du serveur pour toute preuve du serveur recevant les demandes de connexion défaillantes; (2) utilisez 'netstat' sur le serveur pour déterminer si les connexions précédentes ont été fermées ou sont en attente. – NPE

+0

En plus de ce qui précède, 3) Je vérifierais si la pile déborde. 4) Y at-il une fuite de mémoire qui se produit après des milliers de cycles. – Jeff

+0

Les journaux du serveur n'ont indiqué aucun problème. La mémoire est toujours un problème lors de l'utilisation d'Arduinos, mais le code ci-dessus devrait être tout à fait «sans danger pour la mémoire» – ChrisSSocha

Répondre

0

Il existe un bogue dans la bibliothèque Ethernet Arduino dans v22 (comme indiqué dans Linux/Windows V0022/1.0 Ethernet problem SOLVED).

La solution pour moi était d'utiliser la bibliothèque Ethernet2 (par Peter de tinker.it). Le code nécessitait un bricolage mineur, mais tout semble fonctionner correctement maintenant. J'ai réussi à recevoir plus de 40000 messages HTTP envoyés sans aucun problème. (À l'occasion, les messages uniques ne peuvent pas être envoyés, mais ce taux d'erreur est inférieur à 4%.)

0

Je ralentirais le taux de communication en augmentant le temps 10x entre les messages. Alors si vous n'obtenez pas une erreur entre 1000 et 7000 messages, cela signifierait probablement que vous parlez trop vite à votre petit Arduino et que son tampon reçoit un débordement dont la bibliothèque de communication ne peut malheureusement pas récupérer. Je voudrais également surveiller les octets libres Arduino dans un tampon sur le port série après chaque message. Vous pouvez également tester ce comportement en envoyant des messages aussi rapidement que possible à partir du PC, et voir si cela gèlera votre Arduino après un certain temps. Si c'est le cas, vous pouvez envisager de refuser les messages jusqu'à ce que le tampon dépasse une certaine limite.

Questions connexes