【问题标题】:Arduino (Uno) Ethernet client connection fails after many client prints许多客户端打印后,Arduino(Uno)以太网客户端连接失败
【发布时间】:2011-09-15 14:14:18
【问题描述】:

我正在使用带有 Ethernet Shield 的 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;
}

【问题讨论】:

  • 当客户端无法连接时,我会做两件事:(1)检查服务器日志以获取服务器接收失败连接请求的任何证据; (2) 在服务器上使用netstat 来确定之前的连接是否已经关闭或正在逗留。
  • 除上述之外,3)我会检查堆栈是否溢出。 4) 是否存在数千次循环后发生的内存泄漏。
  • 服务器日志没有显示任何问题。使用 Arduinos 时内存总是一个问题,但上面的代码应该是相当“内存安全”的
  • 你是如何从 tinker 下载库的?

标签: c arduino avr avr-gcc


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多