2011-09-15 12 views
5

Estoy usando un Arduino Uno con Ethernet Shield.La conexión del cliente Arduino (Uno) Ethernet falla después de que muchas impresiones del cliente

Después de enviar muchas solicitudes HTTP, client.println (...), el cliente comienza a fallar al conectarse. El tiempo para el fallo parece ser aleatorio, y la lectura de secuencia del ciclo puede variar entre ~ 1000 y ~ 7000.

El error no tiene que ver con la Ethernet Transmit Buffer desbordante (siguientes this advice)

Este es el código que está fallando:

#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(); 
} 

El error se produce en el segmento siguiente

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

En el momento en que el cliente no se conecta, hago dos cosas: (1) revisa los registros del servidor en busca de evidencia del servidor que recibe las solicitudes de conexión fallidas; (2) use 'netstat' en el servidor para establecer si las conexiones previas se han cerrado o están detenidas. – NPE

+0

Además de lo anterior, 3) Verificaría si la pila se está desbordando. 4) ¿Hay una pérdida de memoria que ocurre después de miles de ciclos? – Jeff

+0

Los registros del servidor no indicaron ningún problema. La memoria siempre es un problema al usar Arduinos, pero el código anterior debería ser bastante "seguro para la memoria" – ChrisSSocha

Respuesta

0

Hay un error en la biblioteca de Arduino Ethernet en v22 (como se describe en Linux/Windows V0022/1.0 Ethernet problem SOLVED).

La solución para mí fue utilizar la biblioteca Ethernet2 (por Peter desde tinker.it). El código necesitaba retoques menores, pero todo parece estar funcionando bien ahora. Logré obtener más de 40000 mensajes HTTP enviados sin ningún problema. (Ocasionalmente, no se pueden enviar mensajes individuales, pero esta tasa de error es inferior al 4%.)

0

Reduciría la velocidad de comunicación aumentando el tiempo 10x entre los mensajes. Entonces, si no obtienes un error entre 1000 y 7000 mensajes, probablemente significaría que hablas demasiado rápido con tu pequeño Arduino y que su búfer se desborda de lo que desafortunadamente no se puede recuperar la biblioteca de comunicación. También supervisaría los bytes libres de Arduino en un búfer sobre el puerto serie después de cada mensaje. También puede probar este comportamiento enviando mensajes lo más rápido que pueda desde la PC, y vea si eso congelará su Arduino después de un tiempo. Si lo hace, puede considerar denegar mensajes hasta que el búfer esté por encima de algún límite.

Cuestiones relacionadas