• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Serial. Както странно работает

Serrous

Member
Плата wemos d1 mini.
Код отрабатывает почти нормально. Считывает 1 байт и возвращается и выходит. Но Serial.println(Serial.available()) показывает всегда 0
Цель считать строку.
Код:
void readserial()
{
  //sertemp = "";
  //val=0;
  Serial.println(Serial.available());
  while (Serial.available() == 0);
  {
    val = Serial.read();
    Serial.println(val);
  }
}
Изменив while на != если послать что то в Serial начинается перезагрузка вемоса, пока данных нет он показывает реальные данные. Но Serial.println(Serial.available()) показывает реальные данные.

Код:
0
-1
3

Soft WDT reset

ctx: cont
sp: 3ffef1a0 end: 3ffef3b0 offset: 01b0

>>>stack>>>
3ffef350:  3fffdad0 3ffee2dc 3ffee358 40202178
3ffef360:  00000001 3ffee2dc 3ffee358 40201d30
3ffef370:  feefeffe feefeffe 3ffee374 40201d74
3ffef380:  3fffdad0 00000000 3ffee374 40201dd4
3ffef390:  feefeffe feefeffe feefeffe 40202498
3ffef3a0:  feefeffe feefeffe 3ffee390 40100718
<<<stack<<<

ets Jan  8 2013,rst cause:2, boot mode:(1,6)


ets Jan  8 2013,rst cause:4, boot mode:(1,6)

wdt reset
После чего зависает до перезагрузки кнопкой.Что за хрень и как с этим бороться?
 

Serrous

Member
Читать из сериал надо после проверки поступления данных
ну дак while (Serial.available() != 0); если 0 то он не выполняется же? это и есть проверка.
Когда в сериале пусто, все отрабатывает норм. когда что то прилетает срабатывает val = Serial.read(); и ребут. попробую на if перейти конечно.
 

Serrous

Member
@Serrous вы зависли в цикле и сработал wdt. Что не так?
While будет вычислять в цикле непрерывно и бесконечно до тех пор, пока выражение в круглых скобках, () не станет равно логическому ЛОЖНО.
тоесть (Serial.available() > 0) при Serial.available() = 1 верно. читаем байт . Serial.available() = 0 . 0>0= ЛОЖЬ и выход из цикла. почему я должен зависнуть? или я что то не допонимаю?

а ватчдога мона отключить ? мне там и надо висеть. бесконечно долго пока не придут определенные данные
 

Serrous

Member
ну дак Serial.available() != 0 не равен нулю и когда больше нуля и когда меньше нуля.

покажите весь код
Код:
#include <EEPROM.h>
#include <Arduino.h>


const int eeprom_addr = 100; // Адрес записи в eeprom
String sertemp; //Строка возврата из серийного порта
int iddev;
char ssid[20];
char password[20];
int oborots;
char directions[5];
char code[6];
int itemp; // для циклов
int val=0;



void setup()
{
  Serial.begin (115200);
  readeeprom();
  if (iddev == 0) {
    startup();
  }



}

void loop()
{
  //readeeprom();
  //startup();
  Serial.println("12qwas");
  delay(500);

}

void readeeprom() {
  EEPROM.get(eeprom_addr, iddev); //читаем
  EEPROM.get(eeprom_addr + 10, ssid);
  EEPROM.get(eeprom_addr + 30, password);
  EEPROM.get(eeprom_addr + 50, oborots);
  EEPROM.get(eeprom_addr + 60, directions);
  EEPROM.get(eeprom_addr + 60, code);
  Serial.println(iddev);
  Serial.println(password);
  Serial.println(oborots);
  Serial.println(directions);
  Serial.println(code);
}

void startup()
{
  itemp = 1;
  while (itemp != 0) {  // МНЕ И нужно здесь зависнуть пока не придут определенные данные.
    readserial ();
    if (sertemp == "id") {
      Serial.println(iddev);
      Serial.println("tyt");
      itemp = 0;
    }
  }
}

void readserial()
{
  //sertemp = "";
  //val=0;
  Serial.println(Serial.available());
  if (Serial.available() > 0);
  {
  while (Serial.available() > 0);
  {
    val = Serial.read();
    Serial.println(val);
  }
  }
}
 

CodeNameHawk

Moderator
Команда форума
Вы хотите прочитать хотя бы один байт, а если его нету перезагрузка, ошибка в StartUp
 

Serrous

Member
Вы хотите прочитать хотя бы один байт, а если его нету перезагрузка, ошибка в StartUp
дак как ?
if (Serial.available() > 0);
то читаем пока больше 0
while (Serial.available() > 0);
кроме того Serial.read возвращает -1 если читать нечего

исправление на while (Serial.available() == 0);
читает за раз по 1 байту но вылеты прекращаеются.
Код:
0
97
0
115
0
10
0
Ноли это Serial.println(Serial.available()); что не понятно как так. ибо я послал туда строку.


пипец уже запутался с этим while. крыша едет
 

CodeNameHawk

Moderator
Команда форума
Возможно delay(1); после readserial(); вам поможет зависнуть, не вызвав перезагрузку.
А в самой readserial выкиньте if, while само проверяет наличие данных.
 

CodeNameHawk

Moderator
Команда форума
Ноли это Serial.println(Serial.available()); что не понятно как так. ибо я послал туда строку.
Тут все в порядке, есп приняла на сериал один байт и быстро его прочитала, значит до прихода нового байта
Serial.available() будет равна нулю.
 

CodeNameHawk

Moderator
Команда форума
Выкиньте из вашей программы все не относящиеся к работе с сериал и покажите.
А также покажите что послали в сериал и что получили обратно.
 

Serrous

Member
Выкиньте из вашей программы все не относящиеся к работе с сериал и покажите.
А также покажите что послали в сериал и что получили обратно.
Код:
int val = 0;
void setup() {
Serial.begin (115200);

}

void loop() {
  {
    Serial.println(Serial.available());
    while (Serial.available() > 0);
    {
      val = Serial.read();
      Serial.println(val);
    }

  }
}
До отправки данных в порт
Код:
0
-1
0
-1
0
-1
0
-1
Отправил буквы as+enter. Снижение скорости до 9600 также не помогло
Код:
Soft WDT reset

ctx: cont
sp: 3ffef140 end: 3ffef320 offset: 01b0

>>>stack>>>
3ffef2f0:  00000000 00000000 3ffee2c8 40201c20
3ffef300:  3fffdad0 00000000 3ffee2e4 402020ec
3ffef310:  feefeffe feefeffe 3ffee300 40100718
<<<stack<<<

ets Jan  8 2013,rst cause:2, boot mode:(1,6)


ets Jan  8 2013,rst cause:4, boot mode:(1,6)

wdt reset
ESP8266: Watchdog functions нагуглил это.
Просто дисейбл не помог. что надо обновлять в ардуино иде чтобы юзать эту функцию не понял.
 

CodeNameHawk

Moderator
Команда форума
Поправил. Попробуйте так
Код:
int val = 0;
void setup() {
Serial.begin (115200);
}
void loop() {
  {
    if (Serial.available() > 0);
    {
      val = Serial.read();
      Serial.println( val, DEC);
     }
  }
}
 
Последнее редактирование:

Serrous

Member
в таком варианте IF срабатывает всегда почемуто.

Код:
-1
-1
-1
100
115
115
100
97
115
100
10
-1
-1
-1
-1
когда положительные цифры отправил несколько букв
 

CodeNameHawk

Moderator
Команда форума
А теперь такой вариант
Код:
int val = 0;
void setup() {
Serial.begin (115200);
}
void loop() {
    while (Serial.available() > 0)  // ; это здесь лишнее
    {
      val = Serial.read();
      Serial.println(val,DEC);
    }
  }
 

Serrous

Member
while (Serial.available() > 0) // ; это здесь лишнее

-1 это я не то ткунл... как то точка с запятой после ифа появилась. а так все работало норм.
так работает. огромное спасибо. Туплю чет.
 
Сверху Снизу