我正在使用带有以太网盾的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)
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。如果是这样,您可以考虑拒绝消息,直到缓冲区超过某个限制。