• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Непонятки с работой модуля в домашней сети

BARS__

New member
Всем привет.
Есть модуль ESP8266, работает в качестве сетевой карты для STM32. Прошивка в нем совсем простецкая, точка доступа и сервер для настройки самого модуля и тупой пересыл UDP пакетов по UART. Собственно именно в этом тупом пересыле и возникла проблема. Если послать несколько пакетов подряд (в среднем 10-11), то модуль явно перестает их принимать. При этом сам модуль явно не зависает, т.к. переключение в режим точки доступа и обратно работает нормально. При этом после этого самого переключения работа восстанавливается, но не на долго. При этом модуль перестает пинговаться. Кроме этого, даже во время нормальной работы модуль не виден в списке подключенных устройств в настройках роутера. Коннект к сети выполняется вот так:
Код:
/**
* Соединение с WiFi
*/
bool ConnectWiFi(const char *ssid, const char *pass, String IP) {
  // Три попытки соединения по WiFi
 
  uint8_t i = 0, j = 0, ip[4];

  i = IP.indexOf('.');
  ip[0] = IP.substring(0, i).toInt();

  j = IP.indexOf('.', i+1);
  ip[1] = IP.substring(i+1, j).toInt();

  i = IP.indexOf('.', j+1);
  ip[2] = IP.substring(j+1, i).toInt();

  j = IP.length();
  ip[3] = IP.substring(i+1, j).toInt();

  IPAddress ip_addr(ip[0], ip[1], ip[2], ip[3]);
  IPAddress ip_gate(ip[0], ip[1], ip[2], 1);
  IPAddress ip_subnet(255, 255, 255, 0);

  WiFi.mode(WIFI_STA);
  WiFi.config(ip_addr, ip_gate, ip_subnet);

  for(int i = 0; i < 3; i++) {
   
    WiFi.begin(ssid, pass);
 
    for(int j = 0; j < 10; j++){

      if(WiFi.status() == WL_CONNECTED){
        return true;
      }

      delay(1000);
    }
  }

    return false;
}

В чем может быть проблема? Может и не модуль вовсе виноват, а роутер?
 
Последнее редактирование:

BARS__

New member
@BARS__
А этот момент прием UART ведется? Может его буфер переполняется?
В том то и дело, что обмен идет в одну сторону, с ПК отправляется пакет по UDP, длина всего 7 байт, ESP его принимает и сразу шлет по UART, попутно запоминая, откуда пришел пакет.
Код:
    packetSize = Udp.parsePacket();
    if(packetSize){
      Udp.read(packetBuffer, packetSize);

      ip_receiver = Udp.remoteIP();
      port_receiver = Udp.remotePort();

      Serial.write(packetBuffer, packetSize);
    }
По UART модуль ничего не принимает, только передает. При этом, если я после зависания шлю ему по UART команду перейти в режим точки доступа, он отлично это отрабатывает. И после возврата из этого режима и подключения к сети (при этом никакие перезагрузки модуля не происходят) он опять начинает работать.
 

BARS__

New member
А вот то, что я его в настройках роутера не вижу, это нормально?
 

nikolz

Well-known member
добавьте
это на CИ (для дурины посмотрите как)
if (wifi_station_get_auto_connect()==0) wifi_station_set_auto_connect(1);
wifi_station_set_reconnect_policy(true);
 

kab

New member
По UART модуль ничего не принимает, только передает
Я имел в виду, что, если модуль пишет в UART, то кто-то другой, например, компьютер, должен принимать из UART, освобождая буфер. И здесь, на форуме, было чьё-то предположение, что, так как скорость wifi существенно больше скорости UART, то велика вероятность буфер UART переполнить. Что приводит к каким-то нехорошестям.
 

BARS__

New member
Я имел в виду, что, если модуль пишет в UART, то кто-то другой, например, компьютер, должен принимать из UART, освобождая буфер.
Хм, ну передача идет в МК, но модулю я никак не сообщаю, что буфер прочитан. Просто привык на МК, что данные закинул в регистр UART и забыл про них, дальше железо само разберется. А как тут правильно сделать? Другое дело, что и в сети он не пингуется.
 

BARS__

New member
Обнаружил еще одну странность. Если модуль воткнут в кусок макетки, на котором я его прошиваю, то все работает стабильно. Стоит воткнуть его в плату в МК - начинаются проблемы.
 

pvvx

Активный участник сообщества
Всё это возникает только в режиме ST (station) на модуле? При AP+ST работает?
Если так - отключите режим "MODEM" sleep у ST. Он стоит по умолчанию. Переключите в "NONE".

В режиме ST и опции "MODEM" или "LIGHT" модуль включает режим сна с DTIMx (спит между beacon от AP). Включает такой режим при паузе в передачах. При последующей передаче к нему пакета возникает тайм-аут до следующего beacon (по умолчанию 0.102 сек). Пакет UDP и последующие не доходят, пока модуль не проснется приняв beacon от AP с пометками, что ему есть передача. TCP при этом сделает перезапрос... UDP - улетит, т.к. его никто дублировать не будет - нет у него гарантий доставки, а роутер с AP не резиновый и всем "спящим" станциям сохранять и дублировать посланные пакеты UDP не будет...

При включенной AP на модуле, все эти режимы сна не включаются, т.к. работа AP требует постоянной активности на отслеживание эфира...

Обнаружил еще одну странность. Если модуль воткнут в кусок макетки, на котором я его прошиваю, то все работает стабильно. Стоит воткнуть его в плату в МК - начинаются проблемы.
Модуль ESP8266 не терпит помех по проводкам к нему. Если у вас питание модуля в норме, в первую очередь повесьте какую емкость на пин RESET и GND в пару нФ (иначе ловит импульсы в 1 нс). Если не поможет - смотрите другие ноги. Есть вариант когда и это не помогает - Station улетает...
 
Последнее редактирование:

BARS__

New member
Обнаружил еще одну странность. Если модуль воткнут в кусок макетки, на котором я его прошиваю, то все работает стабильно. Стоит воткнуть его в плату в МК - начинаются проблемы.
А нет, ошибся. Просто иногда везет и модуль не зависает.
 

BARS__

New member
Всё это возникает только в режиме ST
В режиме AP+STA вроде как все путем, но там я чисто ввожу параметры на странице в браузере. А вот когда модуль в режиме STA и подключен к роутеру, то зависает при работе с UDP и даже пинг до него не доходит. При этом модуль говорит, что соединение установлено, выдает IP, порт и имя сети. Переключение из режима в режим дает ему еще несколько минут работы.
 
Последнее редактирование:

pvvx

Активный участник сообщества
В режиме AP+STA вроде как все путем, но там я чисто ввожу параметры на странице в браузере. А вот когда модуль в режиме STA и подключен к роутеру, то зависает при работе с UDP и даже пинг до него не доходит. Переключение из режима в режим дает ему еще несколько минут работы.
Дописал уточнение выше. ВОзможно - оно...
 

BARS__

New member
В режиме ST и опции "MODEM" или "LIGHT"
Хм. А как правильно отключить режим сна и энергосбережения?

Модуль ESP8266 не терпит помех по проводкам к нему. Если у вас питание модуля в норме, в первую очередь повесьте какую емкость на пин RESET и GND в пару нФ
Питание смотрел осциллом, просадок нет, шумов тоже нет. RESET идет на ногу МК, попробую повесить на него кондер.
 

pvvx

Активный участник сообщества
Хм. А как правильно отключить режим сна и энергосбережения?
Обращайтесь к Arduin-щикам. Там надо подрубить всякие #include и вызвать функции SDK, если их нет в Дуриновских либах. Я не занимаюсь Arduinio IDE на ESP8266, он и так глючный в SDK... :)


Питание только смотрел осциллом, просадок нет, шумов тоже нет. RESET идет на ногу МК, попробую повесить на него кондер.
Если прямо к ноге - то обычно нет смысла в кондере...
 

BARS__

New member
Я не занимаюсь Arduinio IDE на ESP8266, он и так глючный в SDK
Да я тоже терпеть не могу Arduino, уж очень калечный там редактор кода. Но в нем я хоть пару раз работал и разобраться проще =)

Если прямо к ноге
В принципе это не критично и можно соединить с + питания. Но осциллом на ногах ничего не видно, все ровно и красиво...
 

pvvx

Активный участник сообщества
Да я тоже терпеть не могу Arduino, уж очень калечный там редактор кода. Но в нем я хоть пару раз работал и разобраться проще =)
Тем про это на форуме много - писалось уже много раз. Поищите.
Вам надо включить автоматический реконнект (как описали выше) и отрубить sleep у Station...
Если всё равно будет худо - искать ошибки в коде.
В принципе это не критично и можно соединить с + питания. Но осциллом на ногах ничего не видно, все ровно и красиво...
Осел у вас показывает эми по проводкам в 1 нс? Отверткой побольше потыкайте проводки к модулю и увидите его реакцию :)
STM32 тоже имеет не сверх защиту входов по ЭМИ... Нижний уровень стандартов бытовухи, со значительными упрощениями от предыдущего стандарта, т.к. производители барахла не смогли поддержать нормальные редакции и жаловались что защита каждого пина занимает место на кристалле (а надо дешевле :)), а стандарт промышленный (т.е. что делают производители то и в среднем описывает)...
 
Последнее редактирование:

BARS__

New member
Нижний уровень стандартов бытовухи, со значительными упрощениями от предыдущего стандарта
Ну в работе STM32 я уверен на 100%. У меня в машине уже несколько лет пашет бортовой компьютер на ней без единого сбоя. При этом особых защит по входам и питанию я не делал, а в борт сети помехи приличные бывают...
 
Сверху Снизу