Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Общие вопросы по esp8266", создана пользователем Serrous, 20 мар 2019.

  1. Serrous

    Serrous Новичок

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

    Код (Text):
    1. 0
    2. -1
    3. 3
    4.  
    5. Soft WDT reset
    6.  
    7. ctx: cont
    8. sp: 3ffef1a0 end: 3ffef3b0 offset: 01b0
    9.  
    10. >>>stack>>>
    11. 3ffef350:  3fffdad0 3ffee2dc 3ffee358 40202178
    12. 3ffef360:  00000001 3ffee2dc 3ffee358 40201d30
    13. 3ffef370:  feefeffe feefeffe 3ffee374 40201d74
    14. 3ffef380:  3fffdad0 00000000 3ffee374 40201dd4
    15. 3ffef390:  feefeffe feefeffe feefeffe 40202498
    16. 3ffef3a0:  feefeffe feefeffe 3ffee390 40100718
    17. <<<stack<<<
    18.  
    19. ets Jan  8 2013,rst cause:2, boot mode:(1,6)
    20.  
    21.  
    22. ets Jan  8 2013,rst cause:4, boot mode:(1,6)
    23.  
    24. wdt reset
    25.  
    После чего зависает до перезагрузки кнопкой.Что за хрень и как с этим бороться?
     
  2. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.444
    Симпатии:
    173
    Читать из сериал надо после проверки поступления данных
     
  3. Serrous

    Serrous Новичок

    Сообщения:
    34
    Симпатии:
    3
    ну дак while (Serial.available() != 0); если 0 то он не выполняется же? это и есть проверка.
    Когда в сериале пусто, все отрабатывает норм. когда что то прилетает срабатывает val = Serial.read(); и ребут. попробую на if перейти конечно.
     
  4. Serrous

    Serrous Новичок

    Сообщения:
    34
    Симпатии:
    3
    результат тот же
    Код (Text):
    1. void readserial()
    2. {
    3.   //sertemp = "";
    4.   //val=0;
    5.   Serial.println(Serial.available());
    6.   if (Serial.available() > 0);
    7.   {
    8.   while (Serial.available() > 0);
    9.   {
    10.     val = Serial.read();
    11.     Serial.println(val);
    12.   }
    13.   }
    14. }
     
  5. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.127
    Симпатии:
    226
    @Serrous вы зависли в цикле и сработал wdt. Что не так?
     
  6. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.444
    Симпатии:
    173
    ну дак Serial.available() != 0 не равен нулю и когда больше нуля и когда меньше нуля.
    покажите весь код
     
  7. Serrous

    Serrous Новичок

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

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

    Serrous Новичок

    Сообщения:
    34
    Симпатии:
    3
    Код (Text):
    1. #include <EEPROM.h>
    2. #include <Arduino.h>
    3.  
    4.  
    5. const int eeprom_addr = 100; // Адрес записи в eeprom
    6. String sertemp; //Строка возврата из серийного порта
    7. int iddev;
    8. char ssid[20];
    9. char password[20];
    10. int oborots;
    11. char directions[5];
    12. char code[6];
    13. int itemp; // для циклов
    14. int val=0;
    15.  
    16.  
    17.  
    18. void setup()
    19. {
    20.   Serial.begin (115200);
    21.   readeeprom();
    22.   if (iddev == 0) {
    23.     startup();
    24.   }
    25.  
    26.  
    27.  
    28. }
    29.  
    30. void loop()
    31. {
    32.   //readeeprom();
    33.   //startup();
    34.   Serial.println("12qwas");
    35.   delay(500);
    36.  
    37. }
    38.  
    39. void readeeprom() {
    40.   EEPROM.get(eeprom_addr, iddev); //читаем
    41.   EEPROM.get(eeprom_addr + 10, ssid);
    42.   EEPROM.get(eeprom_addr + 30, password);
    43.   EEPROM.get(eeprom_addr + 50, oborots);
    44.   EEPROM.get(eeprom_addr + 60, directions);
    45.   EEPROM.get(eeprom_addr + 60, code);
    46.   Serial.println(iddev);
    47.   Serial.println(password);
    48.   Serial.println(oborots);
    49.   Serial.println(directions);
    50.   Serial.println(code);
    51. }
    52.  
    53. void startup()
    54. {
    55.   itemp = 1;
    56.   while (itemp != 0) {  // МНЕ И нужно здесь зависнуть пока не придут определенные данные.
    57.     readserial ();
    58.     if (sertemp == "id") {
    59.       Serial.println(iddev);
    60.       Serial.println("tyt");
    61.       itemp = 0;
    62.     }
    63.   }
    64. }
    65.  
    66. void readserial()
    67. {
    68.   //sertemp = "";
    69.   //val=0;
    70.   Serial.println(Serial.available());
    71.   if (Serial.available() > 0);
    72.   {
    73.   while (Serial.available() > 0);
    74.   {
    75.     val = Serial.read();
    76.     Serial.println(val);
    77.   }
    78.   }
    79. }
     
  9. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.444
    Симпатии:
    173
    Вы хотите прочитать хотя бы один байт, а если его нету перезагрузка, ошибка в StartUp
     
  10. Serrous

    Serrous Новичок

    Сообщения:
    34
    Симпатии:
    3
    дак как ?
    if (Serial.available() > 0);
    то читаем пока больше 0
    while (Serial.available() > 0);
    кроме того Serial.read возвращает -1 если читать нечего

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


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

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.444
    Симпатии:
    173
    Возможно delay(1); после readserial(); вам поможет зависнуть, не вызвав перезагрузку.
    А в самой readserial выкиньте if, while само проверяет наличие данных.
     
  12. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.444
    Симпатии:
    173
    Тут все в порядке, есп приняла на сериал один байт и быстро его прочитала, значит до прихода нового байта
    Serial.available() будет равна нулю.
     
  13. Serrous

    Serrous Новичок

    Сообщения:
    34
    Симпатии:
    3
    делей не помог. даж 20 поставил.
     
  14. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.444
    Симпатии:
    173
    Выкиньте из вашей программы все не относящиеся к работе с сериал и покажите.
    А также покажите что послали в сериал и что получили обратно.
     
  15. Serrous

    Serrous Новичок

    Сообщения:
    34
    Симпатии:
    3
    Код (Text):
    1. int val = 0;
    2. void setup() {
    3. Serial.begin (115200);
    4.  
    5. }
    6.  
    7. void loop() {
    8.   {
    9.     Serial.println(Serial.available());
    10.     while (Serial.available() > 0);
    11.     {
    12.       val = Serial.read();
    13.       Serial.println(val);
    14.     }
    15.  
    16.   }
    17. }
    До отправки данных в порт
    Код (Text):
    1. 0
    2. -1
    3. 0
    4. -1
    5. 0
    6. -1
    7. 0
    8. -1
    9.  
    Отправил буквы as+enter. Снижение скорости до 9600 также не помогло
    Код (Text):
    1. Soft WDT reset
    2.  
    3. ctx: cont
    4. sp: 3ffef140 end: 3ffef320 offset: 01b0
    5.  
    6. >>>stack>>>
    7. 3ffef2f0:  00000000 00000000 3ffee2c8 40201c20
    8. 3ffef300:  3fffdad0 00000000 3ffee2e4 402020ec
    9. 3ffef310:  feefeffe feefeffe 3ffee300 40100718
    10. <<<stack<<<
    11.  
    12. ets Jan  8 2013,rst cause:2, boot mode:(1,6)
    13.  
    14.  
    15. ets Jan  8 2013,rst cause:4, boot mode:(1,6)
    16.  
    17. wdt reset
    18.  
    ESP8266: Watchdog functions нагуглил это.
    Просто дисейбл не помог. что надо обновлять в ардуино иде чтобы юзать эту функцию не понял.
     
  16. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.444
    Симпатии:
    173
    Поправил. Попробуйте так
    Код (Text):
    1. int val = 0;
    2. void setup() {
    3. Serial.begin (115200);
    4. }
    5. void loop() {
    6.   {
    7.     if (Serial.available() > 0);
    8.     {
    9.       val = Serial.read();
    10.       Serial.println( val, DEC);
    11.      }
    12.   }
    13. }
     
    Последнее редактирование: 20 мар 2019
  17. Serrous

    Serrous Новичок

    Сообщения:
    34
    Симпатии:
    3
    в таком варианте IF срабатывает всегда почемуто.

    Код (Text):
    1. -1
    2. -1
    3. -1
    4. 100
    5. 115
    6. 115
    7. 100
    8. 97
    9. 115
    10. 100
    11. 10
    12. -1
    13. -1
    14. -1
    15. -1
    16.  
    когда положительные цифры отправил несколько букв
     
  18. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.444
    Симпатии:
    173
    -1 тут не должно быть.
     
  19. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.444
    Симпатии:
    173
    А теперь такой вариант
    Код (Text):
    1. int val = 0;
    2. void setup() {
    3. Serial.begin (115200);
    4. }
    5. void loop() {
    6.     while (Serial.available() > 0)  // ; это здесь лишнее
    7.     {
    8.       val = Serial.read();
    9.       Serial.println(val,DEC);
    10.     }
    11.   }
     
  20. Serrous

    Serrous Новичок

    Сообщения:
    34
    Симпатии:
    3
    while (Serial.available() > 0) // ; это здесь лишнее

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

Поделиться этой страницей