UDP.endPacket() вешает ардуино на ~2 секунды
- Войдите на сайт для отправки комментариев
Пт, 28/02/2014 - 15:12
Добрый день.
Ардуино ведет непрерывный обмен с клиентом по TCP, время от времени нужно синхронизировать время с NTP севером по UDP. Если НТП сервер доступен, то никаких проблем нет, но если он по какой-то причине отключен (а такое вполне допустимо), то при попытке отправить UDP пакет ардуино подвисает на ~2 секунды.
Почему такое происходит? Как с этим бороться?
Arduino Mega 2560 + Ethernet Shield
В файле \arduino\libraries\Ethernet\utility\socket.cpp
Перепите функцию так, что бы она не блокировала программу.
Перепите функцию так, что бы она не блокировала программу.
Так а зачем? Работа по TIMEOUT, уж 2 секунды непроблема или проблема (автору)?
или проблема (автору)?
А вы как думаете? Или предпологаете что, ТС создал тему просто для ознакомления форума с тем фактом, что UDP.endPacket() вешает ардуино на ~2 секунды? (риторика)
Перепите функцию так, что бы она не блокировала программу.
Удалил весь цикл while, вроде все работает, спасибо!
Так а зачем? Работа по TIMEOUT, уж 2 секунды непроблема или проблема (автору)?
В нем то и проблема. По TCP идет обмен с периодом 10мс, задержка в 2 секунды весьма критична.
Удалил весь цикл while, вроде все работает, спасибо!
Добавьте свой таймаут в 10 мсек, который будет не критичен.
или проблема (автору)?
А вы как думаете? Или предпологаете что, ТС создал тему просто для ознакомления форума с тем фактом, что UDP.endPacket() вешает ардуино на ~2 секунды? (риторика)
Давайте язвить не будем! Да и спрашивал я не у вас...
Теперь автору:
По существу, в Eth модуле есть 2 регистра связанные с задержкой:
RTR (Retry Time-value Register) [R/W] [0x0017 – 0x0018] [0x07D0] и
RCR (Retry Count Register) [R/W] [0x0019] [0x08]
Спасибо, так удобнее, чем библиотеку править.
Не совсем понял, как настраивать эти регистры... Видимо, слегка нуб в электронике(
А такой вопрос на ESP8266:
не отправляет данные. Если раскоментировать задержку то отправляет. Как понять необходимую задержку, а точнее что проверить чтоб понять что пакет ушел? Serial.println(Udp.endPacket()); возвращает 1.
не отправляет данные. Если раскоментировать задержку то отправляет. Как понять необходимую задержку, а точнее что проверить чтоб понять что пакет ушел? Serial.println(Udp.endPacket()); возвращает 1.
Уменьшить делей до 1 миллис. Если не отправит, то до двух.. Ну и т/д
Очевидно, что процессор отрабатывает рестарт быстрее, чем модем отправку байта
Уменьшить делей до 1 миллис. Если не отправит, то до двух.. Ну и т/д
Но вопрос, мне кажется, в другом: Udp.flush();
Ну, вообще-то, зная скорость соединения и объем данных, величина задержки определяется по правилам арифметики (а не подбором).
Но вопрос, мне кажется, в другом: Udp.flush();
С первым не поспоришь. А flush() тут не при чем. endPacket() фактически выполняет передачу пакета
Как это ни при чем?
Посмотрите разницу так и с закомментированным flush().
Как это ни при чем?
Посмотрите разницу так и с закомментированным flush().
Чем же UDP.flush() ускоряет отправку? Если только вместо delay() его использовать?
UPD вообще то, если бы вопрошавший p-a-h-a взял на себя труд проверить гипотезу c flush() в своем проекте, было бы интересно
если вопрошающему так критичны задержки при работе с Ethernet, ему имеет смысл самому с модулем через регистры общаться
Спасибо за ответы. flush я вписывал перед сном еще до того как вопрос задал. Задержки методом тыка не подобрать т.к. иногда короткой хватает, чаще нет. Роутер кривой, в нем еще большая проблема. Изначально стоит задача отправить пакет на погодный сервер narodmon.ru:8283. Протоколы UDP, TCP, Json. Через роутер TP-link по TCP c отключенным DHCP пакет данных уходит за 0,27сек успев снять 4 показания погодных данных. Сейчас столкнулся с роутером Netis. Через него 1,1 сек. Стал разбираться, выяснилось что роутер тупит, причем wifi сеть соединяется быстро а вот WiFiClient client; client.connect(rtcData.Host, 8283); как раз занимают 0,7-0,8 секунды. Хотел через UDP попробовать выкрутится, но не тут то было. В общем гадать думаю смысла нет, грешу на кривой роутер.
p-a-h-a, дурацкий вопрос можно? Нафига вообще
ESP.restart();?
В длинном коде прибора ESP.deepSleep(330e6); Для отладки написал короткий код с немедленной перезагрузкой. Особой разницы в данном примере между сном и перезагрузкой не вижу.
endPacket() фактически выполняет передачу пакета
Как это ни при чем?
Посмотрите разницу так и с закомментированным flush().
Чем же UDP.flush() ускоряет отправку? Если только вместо delay() его использовать?
Возможно.
Я предположил, что UDP аналогичен Serial, но, похоже ошибся: в Serial нет endPacket(), а flush() работает по-другому.