许多客户端打印后,Arduino(Uno)以太网客户端连接失败

时间:2011-09-15 14:14:19

标签: c arduino avr avr-gcc

我正在使用带有以太网盾的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;
}

2 个答案:

答案 0 :(得分:1)

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

我的解决方案是使用Ethernet2库(来自tinker.it的Peter)。代码需要稍微修修补补,但现在一切似乎都运行正常。我设法发送了超过40000条HTTP消息而没有任何问题。 (有时候无法发送单个邮件,但此错误率低于4%。)

答案 1 :(得分:0)

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