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

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


#1

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

Плата 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();

}


#2

#3

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


#4

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


#5

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


#6

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


#7

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


#8

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


#9

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


#10

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


#11

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


#12

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


#13

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


#14

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


#15
 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");

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


#16

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


#17

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


#18

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


#19

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