Подключение к w5500

Тема в разделе "Arduino & Shields", создана пользователем Михаил123, 30 сен 2021.

  1. есть некоторое приложение и сервер на меге 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();
    }
    не могу выловить, на какой стороне проблема следующего плана:
    то я свободно подключаюсь из стороннего приложения к этому серверу, то ни в какую коннект не идет.
     
  2. появляются такие сообщения
    Error:Socket Error # 10061 Connection refused -

     
  3. parovoZZ

    parovoZZ Гуру

    w5500 сама по себе глючная...
     
  4. SergeiL

    SergeiL Оракул Модератор

    Да ни хрена он не глючный.
    Работают уже несколько лет три штуки, и ни разу не сглючили.

    Такое поведение как у ТС может быть на этапе прошивки Меги.
    То есть когда идет изменение кода и несколько раз подряд прошивается Мега без выключения питания.
    Я с подобным сталкивался когда делал первое устройство на Leonardo ETH, там так-же W5500.
    Бывало, в какой то момент, устройство переставало подключаться пока не выключишь/включишь питание, после этого сразу все начинало нормально работать.
    Поставил даже аппаратный вочдог на тиньке13, но ни разу он не сработал, и ни разу W5500 не сглючил.
     
  5. b707

    b707 Гуру

    у ТС и не такое может быть, если посмотреть историю его вопросов тут и на ардуино.ру....
     
  6. akl

    akl Гуру

    у меня бывает ардуины наны с CH340 теряют коннект к ком-порту после нескольких перепрошивок. резет не помогает - приходится перетыкивть провод
     
  7. В общем, не глючит она, если провода нормально подсоеденены, без дребезга.
    где надо - припаял, где надо - сделал потолще. и работает.
    а вот со стороны ПО, которым подключаюсь - вопросы на программном уровне. пилю его...

    как поставить вочдог нормально?
     
  8. SergeiL

    SergeiL Оракул Модератор

    Да не нужен он, и без него все очень стабильно работает, если ошибок в коде нет.

    Я искал готовый вочдог на большой период (около 30сек), не нашел. Все что видел до 2-ух секунд.
    А на две секунды не даст код загрузить через загрузчик, нужно отключать вочдог на время загрузки.

    Поэтому сделал на Тини13. У Тини13 один вход, и один выход задействованы.
    Вход тиньки подключен к 13 выходу Ардуины.
    Ардуина мигает встроенным светодиодом (мигает - значит не зависла), и параллельно сбрасывает счетчик на Тини.
    Нет связи, и не может установить - перестаем мигать и сбрасывать Тиньку.

    Тинька насчитала 25 секунд (без изменения состояния входа) - отключила питание Ардуины на 5 секунд.
    У меня реле маленькое стоит, с нормально замкнутыми контактами, много их у меня.
    На OpeHAB выведено количество перезапусков Ардуины. То есть если сработает вочдог, или пропадет связь - будет увеличен счетчик перезапусков.
    Не было перезапусков.
     
    Vovka и DetSimen нравится это.
  9. сейчас в опытной эксплуатации небольшой код.
    прием/передача данный по сети.
    ардуинка получает до 5 пакетов в секнду по 2-3 байта, и дает на них ответы.
    периодически приходят отзывы о том, что обмен останавливается по причине отсутствия ответов от ардуинки, но программа, которая с ней общается, ей данные шлет и показывает, что TCP соединение есть и работает.

    как понять, что происходит с ардуинкой? виснет она, или порт забивается, или что?
    если вытащить из ардуинки питание и вставить обратно, все начинает сразу опять нормально фунциклировать.
     
  10. SergeiL

    SergeiL Оракул Модератор

     
  11. а может с сетевой картой какие то проблемы? которые решаются перезапуском. или как?
     
  12. можно схему изобретения?
     
  13. SergeiL

    SergeiL Оракул Модератор

    Найду, нарисую схему - выложу.
    Там все, ну очень просто, но есть одно "НО". Под Тини13 код написан не под Ардуино ИДЕ.
    По привычке, и за размера памяти Тини13, код написан на Си в ICC_AVR (ImageCraft Cи)
    У меня профф лицензия, а бесплатная с ограничением кода, куда Тини13 влезает многократно.
    Это другое устройство на Меге8 из 2007-го, но суть не меняется:

    upload_2021-10-18_22-47-9.png


    Пока немного не до этого....

    Вы пока посмотрите размеры массивов под принимаемые сообщения. Хватает ли их.
    Библиотеку Ethernet_W5500.h я не тестил, рекомендую Ethernet2.h (она под W5500) с этой библиотекой проблем нет точно.
    Какой у вас адрес, статический или динамический? Если динамический - почитайте это.
     
  14. статический.
    попробую поменять библиотеку.
     
  15. Airbus

    Airbus Радиохулиган Модератор

    Сранно…. Кто то еще использует w5500?
     
  16. SergeiL

    SergeiL Оракул Модератор

    Так а чего странного?
    Надежная железка, надежное подключение по проводу.
    У меня 4 штуки работают. 3 - Leonardo ETH, и одна Амперковская Мега2560 с Амперковским шилом.
     
  17. после подмены библиотеки все-равно есть зависания
    использую для чтения код:
    Код (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);
     
  18. SergeiL

    SergeiL Оракул Модератор

    По тому куску, что вы выложили сказать ничего нельзя.
    Могу лишь сказать, что смысл два раза вызывать 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
     
    то отладочная информация выводится в монитор порта, если эта строка закомментирована, то не выводится.

    На этапе отладки все это анализируется, смотрим чтобы код выполнялся как нужно, а не криво.
     
  19. буквально пару часов назад добавил

    Код (C++):
      size_t size = client.available();
                      if (size > 3)
                        size = 3;
    наблюдаю...
    у меня все пакеты по 3 байта.