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

Нужна помощь ESP Теряет соединение.

_Toor

New member
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>


const char *ssid = "ESP";

WiFiServer server(80);

const char *str = "qwertyuiop[asdfghjklzxcvbnm,qwertyuiosdfghjkxcvbnedrfgthn";
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_AP_STA);
WiFi.softAP(ssid);
server.begin();
Serial.println(ssid);
delay(0);
}

void loop() {
WiFiClient client = server.available();
while (client.connected()) {
client.write("d");
}
}

отправляет d от 1 до 6 раз и отваливается соединение через телнет, wifi остается.
 

Юрий Ботов

Moderator
Команда форума
1 апреля не закончилось?
- wifi client или ap_sta?
- кого вы называете словом telnet?
- где используется "str"?
или мне уже поря спать...
 

_Toor

New member
1 апреля не закончилось?
- wifi client или ap_sta?
- кого вы называете словом telnet?
- где используется "str"?
или мне уже поря спать...
Стринг не используется.
Подключаюсь через утилиту в прикрепленной фотографии она.
- wifi client или ap_sta? не понял вопроса, кажется я чего то не понимаю. Это даа.
Нет дело не в 1 апреле, просто я руконог.
 

Вложения

Юрий Ботов

Moderator
Команда форума
Судя по подключаемым H - файлам у вас web server он ожидает запросы по протоколу HTTP. Например что то вроде "GET путьдофайла HTTP/1.1\r\n...". Вы цепляетесь к нему по протоколу Telnet. У него свои протоколы. При старте он посылает серверу запрос на авторизацию, который http абсолютно не знаком... В принципе, даже повиснуть может. Для начала поставьте в Putty "connection type: Raw" вместо Telnet, чтобы он не удивлял сервер незнакомыми протоколами и посылайте http серверу команды на понятном для него языке HTTP запросов.
 

_Toor

New member
WiFi тоже хочет, чтобы ему дали время для выполнения своих задач.
У вас прога зацикливается в этом цикле, пока собака не сбросит, ну или пока клиент сам не отвалится.
Именно этого мне и нужно, что бы он просто отправлял d без остановки, пробовал добавить delay(100); Что бы как вы сказали дать время wifi, где то читал, что это и дает ему время, хотя не уверен. Все равно отваливается.

Собачку как я понимаю отключить нельзя.
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума
Попробуйте не задерживаться в основном цикле loop.
Типа "вошли" в цикл - передали "несколько байт" и "вышли" из основного цикла.
 

Сергей_Ф

Moderator
Команда форума
@_Toor client.flush(); дожидается окончания отправки буфера. А у Вас он переполнялся, наверное.
 

_Toor

New member
@_Toor
Попробуйте
Код:
while (client.connected()) {
client.write("d");
client.flush();
delay(0);
}
замените Ваш while на if, например.
Просто дайте программе дойти до конца основного цикла, а дальше она сама все сделает, даже без client.flush();
>>Попробуйте не задерживаться в основном цикле loop.
>>Типа "вошли" в цикл - передали "несколько байт" и "вышли" из основного цикла.
но ведь loop идентичен while(true){}
и если я его закрою я туда больше не вернусь. Или я вас не правильно понял. Дожидаться окончания отправки хороший вариант как мне кажется.
и мне все еще интересно, если я вывалюсь из loop() по return куда я попаду? Без отладчика СЛОЖНО СЛОЖНО :)

>>замените Ваш while на if, например.
>> тогда можно не проверять на подключения, а просто отсылать данные.
Хотя да, возможно с if оно бы и заработало. Но нынешнее решение меня устраивает.

Есть еще один маленький вопросик, есть какие то пути отладки?
Например так как это делается в C# или С++. Точки останова, просмотр переменных?
Использую VisualStudio 15 + Visual.Micro.Arduino.Studio
( Кстати последний очень советую, подсветка intellisense и все такое)
По железу напрямую подключаю к ардуино, замыкая reset на землю.

В любом случае, огромное вам спасибо)
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
ведь loop идентичен while(true){}
в общем случае это так, но не применительно к Ардуино ИДЕ для esp8266. Здесь окончание loop позволяет делать esp обслуживание wifi. На счёт того, что не понадобится flush() в этом случае, я не совсем уверен. Может понадобится. А вот логику работы можно будет выстроить правильную.

Вываливаться из loop можно, но не нужно. Ничего хорошего не будет.
 

Paul_B

Member
client.flush(); дожидается окончания отправки буфера. А у Вас он переполнялся, наверное.
Да, вот тут, я оказывается и находил, что client.flush() якобы дожидается отправки буфера. Но так же есть мнение, что на самом деле он очищает буфер, полученный но не прочитанный.
 
Сверху Снизу