ILI9488 3,95 дюйма, сенсорный экран

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


Ясно, это проблема монитор порта ардуино иде. Но наверняка есть простенькие программы (чтоб самому не писать) которые могут посылать в заданный СОМ порт на ПК строку на русском заданной скоростью.

Нет. Это проблема программиста. Монитор работает одинаково в обе стороны, просто при выводе на экран входящих данных он их перекодирует сам, а при отправке исходящих отправляет как есть. Откуда ему знать, что программист собирается делать с этими данными?

Так что это таки твоя проблема, @lilik ))

Сделай перекодировку входящих данных и тебе станет пофигу, в какой кодировке они поступают ))

А почему отправленное собой отобразить не может? :slight_smile:


Две попытки отослать машу.

Это к разработчикам :wink:

Кстати и в приложении для смартфона указано мной было:


Ладно, отвлекусь, а то голова треснет.

Ну если у вас строчка правильная, то значит и байты пришли правильные. Тогда берете неправильные байты и смотрите, чем они отличаются. Если
общее понимание есть, то уже этого сравнения может оказаться достаточно чтобы найти проблему .
Может там какую-нибудь ерунду в программе поправить нужно

Ох не знаю…
Есть такая функция

/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

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

Показывай, как делал и что получается с ней, ну и без нее тоже

Сначала без её использования (строки 68 и 69 не изменены):

//ESP32
// голосовая запись текстом с смартфона и печать через монитор порта
#include "BluetoothSerial.h"
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
#include <SPI.h>          
#include <TFT_eSPI.h>       // Hardware-specific library
TFT_eSPI tft = TFT_eSPI();  // Invoke custom library
#define h  5 //
uint16_t color=tft.color565(0,0,0);
uint16_t x, y;// Переменные для работы с координатами нажатий

BluetoothSerial SerialBT;
String inputString;// строки данных

void setup() {
 SerialBT.begin("ESP32test"); //НАЗВАНИЕ БЛЮТУЗ МОДУЛЯ
 Serial.begin(9600);
tft.init();
tft.setRotation(3);// Переводим дисплей в альбомную ориентацию
tft.fillScreen(color);//заливка фона
tft.setTextSize(3); tft.setTextColor(tft.color565(255,255,0),tft.color565(127,127,127));
tft.setCursor(h,h);  
}

void loop() {
  CheckSerial();//приём данных строк
  if (tft.getTouch(&x, &y)) {//очистка экрана касанием
  tft.fillScreen(color);//заливка фона 
  tft.setCursor(h,h);//возврат курсора 
  }
}
//
//ФУНКЦИИ ПРИЁМА И ОБРАБОТКИ КОМАНД-ДАННЫХ
void CheckSerial()
{
  //
  while (SerialBT.available())//считываем строку данных пока они поступают
  {
    char inChar = (char)SerialBT.read();
    if (inChar == '\n')     //если окончание строки или запрос на загрузку
    {
      MakeCmd();//обрабатываем её данной функцией
      break;
    }
    else inputString += inChar;// иначе удлиняем строку на один символ
  }
 //
 while (Serial.available()) //если есть доступные данные
  {
    char inChar = (char)Serial.read();
    if (inChar == '\n')     //если окончание строки или запрос на загрузку
    {
      MakeCmd();//обрабатываем её данной функцией
      break;
    }
    else inputString += inChar;// иначе удлиняем строку на один символ
 }
}
//
void MakeCmd()
{
  int y = inputString.length(); // присваиваем переменной у число символов в строке
  String cmd = inputString; // передаём строку другой переменной
  inputString = "";//"обнуляем переменную"
  //
 Serial.print(cmd);Serial.println(' ');
 tft.println(cmd);
  //
}

//
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}
//

А потом меняю их на

 Serial.print(utf8rus(cmd));Serial.println(' ');
 tft.println(utf8rus(cmd));

Работаю только с частью монитор-порта, блютуз не трогаю. Суть- в обоих случаях как в посте 126 картинка.

У сериала свое видение. На экран как выводится?

Вопросы решатся сами собой, если разберетесь с кодировками кириллицы. Если же не разберетесь, то подобные вопросы будут возникать регулярно.


Это вывод - ertyu укенг ertyu укенг

Как с ними разбираться? Он собственную кодировку воспроизвести не может.

String inputString;// строки данных

void setup() {
  Serial.begin(9600);
  
}
void loop() {
 while (Serial.available()) //если есть доступные данные
  {
   
    char inChar = (char)Serial.read();
    if (inChar == '\n')     //если окончание строки 
    {
      MakeCmd();//обрабатываем её данной функцией
      break;
    }
    else inputString += inChar;// иначе удлиняем строку на один символ
 }
 
} 
//
void MakeCmd()
{
 // int y = inputString.length(); // присваиваем переменной у число символов в строке
  String cmd = inputString; // передаём строку другой переменной
  inputString = "";//"обнуляем переменную"
  //////
 Serial.println(cmd);

  //////
}

То есть нужно искать некое преобразование, строку cmd переделывать и вновь выводить в порт? Или бесполезно собирать приходящие данные в строку? Или каждый байт приходящий переделывать и в строку собирать?

А теперь внимание, вопрос - используемый шрифт имеет кириллицу?

“Он” - это кто?

Для начала нужно забыть о строках и символах и вывести приходящие данные в HEX формате.
Чтобы понять, что именно приходит.

Он это монитор порта.

:slight_smile:
Встречный вопрос:
Если голосом со смартфона он так пишет


имеет шрифт кириллицу? Или не факт?

Поддержу предыдущего оратора