Соединение с сервером Ethernet Arduino (Uno) завершается после многих распечаток клиентов

Я использую Arduino Uno с Ethernet Shield.

После отправки многих HTTP-запросов client.println (…) клиент начинает сбой при подключении. Время сбоя кажется случайным, и считывание последовательности из цикла может варьироваться от ~ 1000 до ~ 7000.

Ошибка не связана с переполнением буфера передачи Ethernet (после этого совета )

Вот код, который не работает:

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

В библиотеке Ethernet Arduino есть ошибка в версии 22 (как обсуждалось в Linux / Windows V0022 / 1.0 Ethernet проблема SOLVED ).

Решением для меня было использование библиотеки Ethernet2 (от Peter от tinker.it). Кодекс нуждался в незначительном переделке, но теперь все работает нормально. Мне удалось получить более 40000+ HTTP-сообщений, отправленных без каких-либо проблем. (Иногда отдельные сообщения не могут быть отправлены, но этот показатель ошибки составляет менее 4%.)

Я бы замедлял скорость связи, увеличивая время 10 раз между сообщениями. Тогда, если вы не получите сообщение об ошибке между 1000 и 7000 сообщениями, это, вероятно, означает, что вы слишком быстро говорите о своем маленьком Arduino, и в этом буфере есть переполнение, из-за которого, к сожалению, из-за невозможности восстановления этой библиотеки. Я бы также отслеживал свободные байты Arduino в буфере через serial port после каждого сообщения. Вы также можете проверить это поведение, посылая сообщения так быстро, как вы можете с ПК, и посмотрите, не закроет ли это ваш Arduino через некоторое время. Если это так, вы можете отклонить сообщения до тех пор, пока буфер не окажется выше определенного предела.