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

Делюсь опытом Ошибки в Образцах Arduino IDE

yron

Member
В образце WiFiTelnetToSerial чтобы все заработало нужно заменить везде Serial1.println на Serial.println.
Вот код с исправлениями , который у меня на ESP-12F наконец-то заработал.

#include <ESP8266WiFi.h>

//how many clients should be able to telnet to this ESP8266
#define MAX_SRV_CLIENTS 100
const char* ssid = "имя точки доступа";
const char* password = "пароль";

WiFiServer server(23);
WiFiClient serverClients[MAX_SRV_CLIENTS];

void setup() {
pinMode(2, OUTPUT);
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("\nConnecting to "); Serial.println(ssid);
uint8_t i = 0;
while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);
if(i == 21){
Serial.print("Could not connect to"); Serial.println(ssid);
while(1) delay(500);
}
//start UART and the server
Serial.begin(115200);
server.begin();
server.setNoDelay(true);

Serial.print("Ready! Use 'telnet ");
Serial.print(WiFi.localIP());
Serial.println(" 23' to connect");
digitalWrite(2, LOW);
}

void loop() {
uint8_t i;
//check if there are any new clients
if (server.hasClient()){
for(i = 0; i < MAX_SRV_CLIENTS; i++){
//find free/disconnected spot
if (!serverClients || !serverClients.connected()){
if(serverClients) serverClients.stop();
serverClients = server.available();
Serial.print("New client: "); Serial.print(i);
continue;
}
}
//no free/disconnected spot so reject
WiFiClient serverClient = server.available();
serverClient.stop();
}
//check clients for data
for(i = 0; i < MAX_SRV_CLIENTS; i++){
if (serverClients && serverClients.connected()){
if(serverClients.available()){
//get data from the telnet client and push it to the UART
while(serverClients.available()) Serial.write(serverClients.read());
}
}
}
digitalWrite(2, LOW);
//check UART for data
if(Serial.available()){
size_t len = Serial.available();
uint8_t sbuf[len];
Serial.readBytes(sbuf, len);
//push UART data to all connected telnet clients
for(i = 0; i < MAX_SRV_CLIENTS; i++){
if (serverClients && serverClients.connected()){
serverClients.write(sbuf, len);
delay(1);
}
}
}
}
 

yron

Member
Там Serial1 в выводится отладочная информация, нет необходимости менять.
У меня при serial1 ЕСП просто зависала , для проверки чего я добавил включение светодиода подключенного на GPIO2 digitalWrite(2, LOW); , после замены serial1 на serial, telnet server запустился , ранее он не запускался и к точке доступа не подключался. Поменял и все заработало , подключилось к АР и создался телнет сервер.
Проверил еще раз с serial1 , на втором уарте ничего не выходит , светодиод не загорается , к точке доступа не подключается. Короче зависает. Возможно и за того что нет инициализации второго уарта.
 

CodeNameHawk

Moderator
Команда форума
Вроде оба инициализируются.
Код:
  Serial1.begin(115200);
  WiFi.begin(ssid, password);
  Serial1.print("\nConnecting to "); Serial1.println(ssid);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);
  if(i == 21){
    Serial1.print("Could not connect to"); Serial1.println(ssid);
    while(1) delay(500);
  }
  //start UART and the server
  Serial.begin(115200);
 

yron

Member
Вроде оба инициализируются.
Код:
  Serial1.begin(115200);
  WiFi.begin(ssid, password);
  Serial1.print("\nConnecting to "); Serial1.println(ssid);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);
  if(i == 21){
    Serial1.print("Could not connect to"); Serial1.println(ssid);
    while(1) delay(500);
  }
  //start UART and the server
  Serial.begin(115200);
Тогда не знаю почему , но у меня не работает , светодиод не загорается , к точке не подключается , на втором уарте ничего не выходит и телнет сервер не запускается.У меня вот такой косяк происходит. Может это кому-то поможет.
 

Shyster

New member
Тогда не знаю почему , но у меня не работает , светодиод не загорается , к точке не подключается
Потому что конфликт использования GPIO2.
https://esp8266.ru/arduino-ide-esp8266/#serial
[fright]
Serial1 использует аппаратный UART1, работающий только на передачу. UART1 TX это GPIO2. Для включения Serial1 используйте Serial1.begin();

По умолчанию, отладочная информация библиотек WiFi выключается, когда вы вызываете функцию Serial.begin();. Для включения отладочной информации на UART0 используйте Serial.setDebugOutput(true); Для перенаправления вывода отладочной информации на UART1 используйте команду Serial1.setDebugOutput(true);
[/fright]
 

yron

Member
Потому что конфликт использования GPIO2.
https://esp8266.ru/arduino-ide-esp8266/#serial
[fright]
Serial1 использует аппаратный UART1, работающий только на передачу. UART1 TX это GPIO2. Для включения Serial1 используйте Serial1.begin();

По умолчанию, отладочная информация библиотек WiFi выключается, когда вы вызываете функцию Serial.begin();. Для включения отладочной информации на UART0 используйте Serial.setDebugOutput(true); Для перенаправления вывода отладочной информации на UART1 используйте команду Serial1.setDebugOutput(true);
[/fright]
Я знаю что GPIO2 это второй усарт , но и без команды на включение светодиода (образец без изменений) ничего не работало. Я потом добавил команду на светодиод чтобы отследить зависает или нет. даже если происходит конфликт светодиод должен что-то давать. Короче стандартный образец не работает и не только у меня.
 
Сверху Снизу