• Система автоматизации с открытым исходным кодом на базе 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 это я не то ткунл... как то точка с запятой после ифа появилась. а так все работало норм.
так работает. огромное спасибо. Туплю чет.
 
Сверху Снизу