BLYNK
HOME       📲 GETTING STARTED       📗 DOCS       ❓HELP CENTER       👉 SKETCH BUILDER

Терминал "terminal.println"

Всем привет. Возникла проблемы при работе виджета Терминал с русским языком, а именно при передачи на терминал. Появляются битые буквы в разных местах.

Плата esp8266, android 8.


BLYNK_WRITE(V4)
{
  String terminalString = param.asStr();
  if (terminalString == "?") {
    terminal.clear();
    Initialize();
  }
  else if (String("помощ") == param.asStr()) {
    terminal.println("Список команд:");
    terminal.println ("? -  Просмотр установок");


    terminal.println("1.Х - температура включения нагрева в комнате");
    terminal.println("2.Х - температура выключения нагрева в комнате");
    terminal.println("3.Х - температура включения нагрева на балконе");
    terminal.println("4.Х - температура выключения нагрева на балконе");
  }
  else {
    String a, b;
    a = terminalString.substring(0, 1);
    b = terminalString.substring(2);
    switch (a.toInt()) {
      case 1:
        kom_start = constrain(b.toInt(), 1, 100);
        Blynk.virtualWrite(V6, kom_start);
        terminal.println("Температура включения нагрева в комнате " + String(kom_start));
        break;
      case 2:
        kom_stop = constrain(b.toInt(), 1, 100);
        Blynk.virtualWrite(V8, kom_stop);
        terminal.println("Температура выключения нагрева в комнате " + String(kom_stop));
        break;
      default:
        terminal.println("Неправильная команда");
    }
  }
  terminal.flush();

}

Ок. Так не плохо работает, но надеюсь на будущее исправление.

Зачем функция terminal.flush()?

Для полноценной передачи информации на терминал.

Как я понял она делает пробел((( Скажите а почему при передаче командой println то некоторые строки съезжают раньше времени. т.е. перенос в терминале скачет по разному. Не подскажите по какой причине это может быть?

У меня была такая же проблемка.
Решилась выводом строк более короткими порциями (до 40 символов), после которых делал flush().

Вот моя проблема что не так то? почему текст съезжает на другую строку?

так я вывожу меньше 40 символов до сторки переноса и все равно фигня какая то

Действительно, фигня.
Я бы перед выводом в widget терминала сделал бы Serial.println этих же строк, чтобы убедиться что в них нет “дырок” из непечатных кодов. Может ты где-то у себя в коде по char * указателю промахиваешься и попадаешь в область памяти этих строковых констант, и пишешь туда “грязь”.
Я не верю в глюкавость виджета - уж больно это очевидная ошибка.

Ок попробую. Но просто текст то я руками набирал как я мог туда грязь залить хз. Просто я не понимаю в чем отличие функции println(); и println(F());

Да запросто можно попасть.
Например, ты пишешь:
char message[] = “7.Livolo enable”;
message займет 16 байт в ОЗУ.
Потом где-то далее, например:
char *p = message; (Компилятор ругнется, но пропустит)
И еще где-то дальше, например
p[5] = 10;
Что будет ? Байт со значением 10 попадет прямехонько на место буквы ‘o’ в слове “Livolo”.
А что такое код 10 ? Это символ NL - новая строка. Вот твоя строка-константа и разрубилась на 2 части.
Это я, конечно, в явном виде написал, в реальности все может быть конечно не так конкретно и не так заметно, но с тем же результатом

Крч проверил там все гуд. Текст нормальный без грязи. Я даже не знаю че куда еще копнуть то.
Самое интересное что вопрос то не только в переносах а в том что даже бывает не дописывает предложение. т.е. часть напечатает и все а часть нет вообще. Ау разработчики вы где как можете прокомментировать это

Выложи хоть кусок кода

 terminal.println(F("--------Device initialization--------")); 
 terminal.println(F("1.ESP8266 enable"));
 pinMode(LOAD, OUTPUT);                                  
 pinMode(OUTPORT_1, OUTPUT);                      
 pinMode(OUTPORT_2, OUTPUT);                     
 pinMode(OUTPORT_3, OUTPUT);                        
 pinMode(OUTPORT_4, OUTPUT);                             
 pinMode(OUTPORT_5, OUTPUT);                             
 pinMode(OUTPORT_6, OUTPUT);                            
 pinMode(OUTPORT_7, OUTPUT);                             
 //pinMode(OUTPORT_8, OUTPUT);                             
 pinMode(INTPORT_1, INPUT_PULLUP);                       
 pinMode(INTPORT_2, INPUT_PULLUP);                    
 pinMode(INTPORT_3, INPUT_PULLUP);                      
 pinMode(INTPORT_4, INPUT_PULLUP);                    
 pinMode(INTPORT_5, INPUT_PULLUP);                      
 pinMode(INTPORT_6, INPUT_PULLUP);                      
 pinMode(INTPORT_7, INPUT_PULLUP);                      
 //pinMode(INTPORT_8, INPUT_PULLUP);                       
 pinMode(IND_ST_CP, OUTPUT);                             
 pinMode(IND_SH_CP, OUTPUT);                             
 pinMode(IND_DS, OUTPUT);       
 pinMode(RELAY_1, OUTPUT);                           
 pinMode(RELAY_2, OUTPUT);                              
 timer.setInterval(5000L, FNC_433_UPDATE);   
 timer.setInterval(3000L, FNC_LIGHT_UPDATE);                        
 timer.setInterval(2000L, FNC_LEDS_UPDATE);  
 timer.setInterval(10000L,FNC_IMO_UPDATE); 
 timer.setInterval(15000L,FNC_OREGON_UPDATE);           
 timer.setInterval(30000L,FNC_TEMPERATURE_UPDATE);  
 timer.setInterval(45000L,FNC_HUMIDITY_UPDATE);     
 timer.setInterval(60000L,FNC_DC3231_UPDATE);   
 timer.setInterval(90000L,FNC_RECONNECT);          
 terminal.println(F("2.Timers enable"));
 radio.begin();
 delay(100);
 radio.setChannel(100);
 radio.setDataRate(RF24_1MBPS);
 radio.setPALevel(RF24_PA_HIGH);
 radio.openReadingPipe(1,pipe);                                                              
 radio.startListening();                                   
 terminal.println(F("3.NRF2401 enable"));
 rtc.begin();                                            
 terminal.println(F("4.DS3231 enable"));
 //rtc.setDOW(SATURDAY);                               
 //rtc.setTime(13, 30, 0);                          
 //rtc.setDate(25, 11, 2018);
 terminal.println(F("5.WDT enable"));
 digitalWrite(RELAY_2,HIGH);
 terminal.println(F("7.Livolo enable"));
 terminal.flush();
 terminal.println("------------Reports-----------");
 terminal.flush();
 wdt_enable(WDTO_4S);
 Blynk.notify("PLC loaded");

это код с сетапа как раз перед основным циклом. вот на нем и запара например

Попробуй убрать F макрос, или вообще вместо terminal.print попробовать использовать Blynk virtualwrite/n.

Да уж…
Если уж flush не проталкивает, надо попробовать убрать F().
Хотя вряд ли, тогда бы вообще полная грязь была бы…
Пока нет идей…

Проверил на своей программе, все четко выводится, по крайней мере код из сетапа. Нужно капать код, поочередно отключать функции и искать какая часть кода блокирует терминал.

У меня тоже достаточно длинные строки нормально выводятся ( под iOS )

Так в том и фиг что думаю это глюк виджета в плане задержек. Т.е. если ставить просто вывод строк в сетапе без задержек по времени то все ок. если как у меня прям один в один с инициализацией устройств т.е. задержками то такая вот катавасия. И еще вопрос почему терминал может недописывать строку. Например строк одна два слова а печатает полтора остальную не видно как бы. И на долю секунды ее видно когда делаю очищение терминала? есть иди?