Не знаю насчет дуиновского монитора, а монитор VS Code периодически кириллицу забывает и начинает выдавать белиберду. Потом, после очередного обновления, кириллицу вспоминает и начинает отображать. Потом все повторяется ))
Ясно, это проблема монитор порта ардуино иде. Но наверняка есть простенькие программы (чтоб самому не писать) которые могут посылать в заданный СОМ порт на ПК строку на русском заданной скоростью.
Нет. Это проблема программиста. Монитор работает одинаково в обе стороны, просто при выводе на экран входящих данных он их перекодирует сам, а при отправке исходящих отправляет как есть. Откуда ему знать, что программист собирается делать с этими данными?
Так что это таки твоя проблема, @lilik ))
Сделай перекодировку входящих данных и тебе станет пофигу, в какой кодировке они поступают ))
Это к разработчикам
Ну если у вас строчка правильная, то значит и байты пришли правильные. Тогда берете неправильные байты и смотрите, чем они отличаются. Если
общее понимание есть, то уже этого сравнения может оказаться достаточно чтобы найти проблему .
Может там какую-нибудь ерунду в программе поправить нужно
Ох не знаю…
Есть такая функция
/* Функция перекодировки русских букв из 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 картинка.
У сериала свое видение. На экран как выводится?
Вопросы решатся сами собой, если разберетесь с кодировками кириллицы. Если же не разберетесь, то подобные вопросы будут возникать регулярно.
Как с ними разбираться? Он собственную кодировку воспроизвести не может.
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 формате.
Чтобы понять, что именно приходит.
Он это монитор порта.
Поддержу предыдущего оратора