5

我正在使用带有 Ethernet Shield 的 Arduino Uno。

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

该错误与以太网传输缓冲区溢出无关(遵循此建议

这是失败的代码:

#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;
}
4

2 回答 2

1

v22 中的 Arduino 以太网库中有一个错误(如Linux/Windows V0022/1.0 以太网问题已解决)。

我的解决方案是使用Ethernet2库(来自 tinker.it 的 Peter)。代码需要稍作修改,但现在一切似乎都运行良好。我已经成功地发送了超过 40000 条 HTTP 消息,没有任何问题。(偶尔单条消息无法发送,但这个错误率小于4%。)

于 2011-09-21T12:37:12.457 回答
0

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

于 2011-09-20T10:10:19.827 回答