2011-09-15 111 views
5

我正在使用具有以太网屏蔽的Arduino Uno。许多客户端打印后Arduino(Uno)以太网客户端连接失败

发送很多HTTP请求后,client.println(...),连接时客户端开始失败。失败的时间似乎是随机的,循环中的序列读数可以在〜1000和〜7000之间任意变化。

的错误不是做与以太网发送缓冲区溢出(以下this advice

这里是一个错误的代码:

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

在以下段将出现错误

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

在客户端连接失败的时候,我会做两件事:(1)检查服务器日志中是否有任何证据服务器接收失败的连接请求; (2)在服务器上使用'netstat'来确定之前的连接是否已经关闭或者正在等待。 – NPE

+0

除上述之外,3)我会检查堆栈是否溢出。 4)数千个周期后是否发生内存泄漏。 – Jeff

+0

服务器日志没有显示任何问题。使用Arduinos时内存始终是一个问题,但上面的代码应该是'内存安全' – ChrisSSocha

回答

0

v22中的Arduino以太网库存在一个错误(如Linux/Windows V0022/1.0 Ethernet problem SOLVED中所述)。

我的解决方案是使用Ethernet2库(来自tinker.it的Peter)。代码需要小修补,但现在一切似乎都工作正常。我已经成功地发送了超过40000多封没有任何问题的HTTP消息。 (偶尔单个消息不能发送,但是这个错误率低于4%)

0

我会通过在消息之间增加10倍的时间来降低通信速率。那么如果你在1000到7000条消息之间没有得到一个错误,这可能意味着你说的太快而不是你的小Arduino,并且它的缓冲区会导致溢出,通信库不幸地无法恢复。在每条消息之后,我还会通过串行端口监视缓冲区中的Arduino空闲字节。你也可以通过发送消息来尽可能快地从PC上测试这种行为,看看这会在一段时间后冻结你的Arduino。如果是这样,您可能会考虑拒绝消息,直到缓冲区超过某个限制。