Подскажите решение проблемы с Ethernet UDP.beginPacket

Тема в разделе "Arduino & Shields", создана пользователем YeS, 26 окт 2016.

  1. YeS

    YeS Гик

    Всем привет. Столкнулся с проблемой и что-то в голову ничего не приходит. Прошу совета. Ситуация следующая. Имеется ардуино мега с эзернет шилдом, которая как водится циклически выполняет некие операции. В определённый момент срабатывает условие таймера и начинается подпрограмма синхронизации времени с NTP сервером. Работает всё быстро, однако, если оборвать соединение с Интернетом, то команда начинающая отсылку пакета NTP серверу UDP.beginPacket(ip, port) замирает пока у неё в голове не сработает какой-то таймаут видимо. Длится это раздумье секунд 10 пока она не сообразит что связи нет. А мне нужно, чтобы основной цикл loop выполнялся быстрее. Когда есть связь всё летает. Но если связи нет начинается 10-секундный тупняк. Посоветуйте пожалуйста как быть.
     
  2. AlexVS

    AlexVS Гик

    может сначала пингануть сервер и если ответит, тогда уже запускать синхронизацию.
     
    YeS нравится это.
  3. YeS

    YeS Гик

    Пробую такой вариант, но для того чтобы пингануть, нужно для начала определить IP по имени хоста. Попытка это сделать если соединение есть проходит быстро, но если опять же отсутствует соединение, то требуется около 2 секунд, чтобы контроллер понял, что определить IP не получится. Это конечно быстрее чем было, но всё равно 2-х секундная задержка в цикле loop (в то время как должны выполняться задания) это многовато. Мне бы хотя бы до 500-700 миллисекунд сократить.
     
  4. YeS

    YeS Гик

    Если кому интересно, подошёл вариант с использованием асинхронного пинга. В примере PingAsync к библиотеке ICMPPing (latest development version) можно послать пинг, и пока не получен результат пинга выполнять другие критичные операции.
     
    Последнее редактирование: 1 ноя 2016