есть некоторое приложение и сервер на меге 2560 через w5500. Код (C++): #include <Ethernet_W5500.h> //#include <SPI.h> //#include <Twitter.h> #include <util.h> #include "avr/eeprom.h" #include "Adafruit_SHTC3.h" #include "Wire.h" server.begin(); EthernetClient client = server.available(); if (client) { LastPingWork = millis(); size_t size = client.available(); size_t size2; int y = client.read(packetBuffer, size); //server.write(1,1); delay(100); Serial.print(F("состав ВХОДЯЩЕГО пакета ")); Serial.print(size); Serial.println(" знаков"); for (int i = 0; i < size; i++) { Serial.print(packetBuffer[i]); if (i < size - 1) Serial.print(","); } Serial.println(); } не могу выловить, на какой стороне проблема следующего плана: то я свободно подключаюсь из стороннего приложения к этому серверу, то ни в какую коннект не идет.
Да ни хрена он не глючный. Работают уже несколько лет три штуки, и ни разу не сглючили. Такое поведение как у ТС может быть на этапе прошивки Меги. То есть когда идет изменение кода и несколько раз подряд прошивается Мега без выключения питания. Я с подобным сталкивался когда делал первое устройство на Leonardo ETH, там так-же W5500. Бывало, в какой то момент, устройство переставало подключаться пока не выключишь/включишь питание, после этого сразу все начинало нормально работать. Поставил даже аппаратный вочдог на тиньке13, но ни разу он не сработал, и ни разу W5500 не сглючил.
у меня бывает ардуины наны с CH340 теряют коннект к ком-порту после нескольких перепрошивок. резет не помогает - приходится перетыкивть провод
В общем, не глючит она, если провода нормально подсоеденены, без дребезга. где надо - припаял, где надо - сделал потолще. и работает. а вот со стороны ПО, которым подключаюсь - вопросы на программном уровне. пилю его... как поставить вочдог нормально?
Да не нужен он, и без него все очень стабильно работает, если ошибок в коде нет. Я искал готовый вочдог на большой период (около 30сек), не нашел. Все что видел до 2-ух секунд. А на две секунды не даст код загрузить через загрузчик, нужно отключать вочдог на время загрузки. Поэтому сделал на Тини13. У Тини13 один вход, и один выход задействованы. Вход тиньки подключен к 13 выходу Ардуины. Ардуина мигает встроенным светодиодом (мигает - значит не зависла), и параллельно сбрасывает счетчик на Тини. Нет связи, и не может установить - перестаем мигать и сбрасывать Тиньку. Тинька насчитала 25 секунд (без изменения состояния входа) - отключила питание Ардуины на 5 секунд. У меня реле маленькое стоит, с нормально замкнутыми контактами, много их у меня. На OpeHAB выведено количество перезапусков Ардуины. То есть если сработает вочдог, или пропадет связь - будет увеличен счетчик перезапусков. Не было перезапусков.
сейчас в опытной эксплуатации небольшой код. прием/передача данный по сети. ардуинка получает до 5 пакетов в секнду по 2-3 байта, и дает на них ответы. периодически приходят отзывы о том, что обмен останавливается по причине отсутствия ответов от ардуинки, но программа, которая с ней общается, ей данные шлет и показывает, что TCP соединение есть и работает. как понять, что происходит с ардуинкой? виснет она, или порт забивается, или что? если вытащить из ардуинки питание и вставить обратно, все начинает сразу опять нормально фунциклировать.
Найду, нарисую схему - выложу. Там все, ну очень просто, но есть одно "НО". Под Тини13 код написан не под Ардуино ИДЕ. По привычке, и за размера памяти Тини13, код написан на Си в ICC_AVR (ImageCraft Cи) У меня профф лицензия, а бесплатная с ограничением кода, куда Тини13 влезает многократно. Это другое устройство на Меге8 из 2007-го, но суть не меняется: Пока немного не до этого.... Вы пока посмотрите размеры массивов под принимаемые сообщения. Хватает ли их. Библиотеку Ethernet_W5500.h я не тестил, рекомендую Ethernet2.h (она под W5500) с этой библиотекой проблем нет точно. Какой у вас адрес, статический или динамический? Если динамический - почитайте это.
Так а чего странного? Надежная железка, надежное подключение по проводу. У меня 4 штуки работают. 3 - Leonardo ETH, и одна Амперковская Мега2560 с Амперковским шилом.
после подмены библиотеки все-равно есть зависания использую для чтения код: Код (C++): EthernetClient client = server.available(); if (client) { if (client.connected()) { if (client.available()) { LastPingWork = millis(); size_t size = client.available(); size_t size2; int y = client.read(packetBuffer, size);
По тому куску, что вы выложили сказать ничего нельзя. Могу лишь сказать, что смысл два раза вызывать client.available(); - нет. Сделайте также как и server.available();, но это не повлияет на зависания. Нет проверки количества полученных байт на превышения размера приемного буфера. Если получите больше - попортите память, что легко может привести к зависаниям. Вставляйте везде Serial.print(xxx); учитесь отлаживать код. Тогда будет понятно, что получили, что передали, где зависли. У меня отладочный вывод везде, если посчитать его с проверками на корректность полученных данных, то точно наверное столько же: Код (C++): if (PubSub_Connct_TO) return; #ifdef DEBUG_OUTPUT Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); #endif Если вначале есть определение: Код (C++): #define DEBUG_OUTPUT то отладочная информация выводится в монитор порта, если эта строка закомментирована, то не выводится. На этапе отладки все это анализируется, смотрим чтобы код выполнялся как нужно, а не криво.
буквально пару часов назад добавил Код (C++): size_t size = client.available(); if (size > 3) size = 3; наблюдаю... у меня все пакеты по 3 байта.