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

我正在使用带有以太网盾的Arduino Uno。

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

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

这是失败的代码:

#include  #include  // 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; } 

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

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

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