2011-09-15 10 views
5

Utilizzo un Arduino Uno con Ethernet Shield.La connessione al client Ethernet Arduino (Uno) non riesce dopo molte stampe client

Dopo aver inviato molte richieste HTTP, client.println (...), il client inizia a fallire durante la connessione. Il time to failure sembra essere casuale, e la lettura della sequenza dal loop può variare tra ~ 1000 e ~ 7000.

L'errore non è a che fare con l'Ethernet Buffer di trasmissione traboccante (seguendo this advice)

Ecco il codice che sta fallendo:

#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'errore si verifica nella seguente segmento

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

Nel punto in cui il client non riesce a connettersi, farei due cose: (1) controllare i log del server per qualsiasi prova del server che riceve le richieste di connessione non riuscite; (2) utilizzare 'netstat' sul server per stabilire se le connessioni precedenti sono state chiuse o sospese. – NPE

+0

In aggiunta a sopra, 3) Vorrei controllare se la pila è straripante. 4) C'è una perdita di memoria che si verifica dopo migliaia di cicli. – Jeff

+0

I registri del server non indicano alcun problema. La memoria è sempre un problema quando si utilizza Arduinos, ma il codice sopra dovrebbe essere abbastanza "sicuro per la memoria" – ChrisSSocha

risposta

0

C'è un errore nella libreria Ethernet di Arduino nella v22 (come descritto in Linux/Windows V0022/1.0 Ethernet problem SOLVED).

La soluzione per me era usare la libreria Ethernet2 (di Peter da tinker.it). Il codice aveva bisogno di piccoli ritocchi, ma ora sembra che tutto funzioni bene. Sono riuscito a ottenere oltre 40000+ messaggi HTTP inviati senza problemi. (A volte i messaggi singoli non possono essere inviati, ma questo tasso di errore è inferiore al 4%.)

0

Vorrei rallentare la velocità di comunicazione aumentando il tempo 10x tra i messaggi. Quindi se non ricevi un errore tra 1000 e 7000 messaggi, probabilmente vorrai dire che stai parlando troppo velocemente con il tuo piccolo Arduino e il suo buffer ha un overflow da cui purtroppo non è possibile recuperare la libreria di comunicazione. Monitorerei anche i byte liberi di Arduino in un buffer sulla porta seriale dopo ogni messaggio. Puoi anche testare questo comportamento inviando messaggi il più velocemente possibile dal PC, e vedi se questo bloccherà Arduino dopo un po '. In tal caso, potresti considerare di negare i messaggi finché il buffer non supera il limite.

Problemi correlati