+7 (495) 662-44-14

Главная / Форум
  • РУС / ENG
(495) 662-44-14 Многоканальный телефон Не дозвонились?
Форумы >>ЖК индикаторы >>RE: принцип вывода русской строки
RE: принцип вывода русской строки

supercelt
Пользователи

Сообщений: 3
Регистрация: 08.08.2017

Здравствуйте! Заранее извиняюсь, если тема уже была. Купил я значит МЭЛТ MT-16S2D-2YLG. Сразу оговорюсь, что не использую конструкторы типа ардуино и т.д. подключаю я его к stm32f4. Ну и по привычке захотел вывести стоку LCD_string("Я русский текст"; И не тут-то было. Это прокатывает с латиницей. Вобщем как уже не раз говорилось таблица не совпадает с кодом символа. Я не использую готовые библиотеки, поэтому не скажете алгоритм перекодировки кода символа в код соответствующий таблице 2. ?

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1153
Регистрация: 25.11.2009

Алгоритм перекодировки - по таблице соответствий, примерно так: NewCode=table[OldCode]; - разумеется её придётся предварительно правильно заполнить. Готовой таблицы у нас нет т.к. проще воспользоваться вторым способом, который мы специально реализовали в наших индикаторах.
Второй способ: включить другую страницу знакогенератора и использовать обычную кодовую страницу Windows (CP1251). Страница знакогенератора задаётся битом P в команде Function Set. При переключении страниц не испортить бит DL! Удобно включить страницу в инициализации индикатора и больше никогда не трогать, заменив команду 0x38/0x28 на 0x3A/0x2A.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

supercelt
Пользователи

Сообщений: 3
Регистрация: 08.08.2017

Фишка в том, что я и беру символы из 1 таблицы, то есть в мануале - это вторая. Посмотрел, действительно, все буквы сидят на своих местах с точки зрения win1251. Но у меня почему-то программа упорно видит символы как utf. При том, что я в программе (Keil) выставил cp1251 и сам файл перекодировал в 1251

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1153
Регистрация: 25.11.2009

Utf8 это беда. Создавать таблицу перекодировки в миллионы ячеек - тупик. А поддерживать весь Unicode шрифт в индикаторах - даже не тупик, это просто невозможно.
Тогда или переопределите свои строковые типы данных, чтобы они стали Ansi (и не WideAnsi), либо используйте стандартные функции перекодировки из Utf в Ansi (типа StrUftToAnsi или StrUtfToOEM, понятия не имею как они могут называться в ваших библиотеках), они часто поставляются в стандартных библиотеках к компилятору - т.е. переложите задачу перекодировки на компилятор.
Посмотрите листинг, объектник или вообще бинарник, какие именно символы сидят в прошивке. Может там CP1251 и не пахнет ... Или если они в прошивке правильные, то ошибка где-то в обращении к индикатору. Так, не видя прошивки и исходного кода функций обращения к индикатору, сказать что-то определённое трудно.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1153
Регистрация: 25.11.2009

Выходит проблема скорее всего фактически не в индикаторе и выводе на него русских символов, а в компиляторе, как в нём получить русские символы в нужной кодировке. С этим помочь вряд ли могу, лучше будет обратиться на форум по компилятору.
На крайний случай всегда можно вынести весь текст (включая и отдельные символы) в отдельные подключаемые файлы, inc сразу в нужной кодировке или lib (в этих экспортировать указатели на массивы байт в нужной кодировке, скомпилённые чем угодно другим) или res (ресурсов). Тут уж вмешательство компилятора будет ничтожным. Да, неудобно. Зато легко будет переводить на другие языки.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

supercelt
Пользователи

Сообщений: 3
Регистрация: 08.08.2017

Короче я можно сказать решил проблему))). Вобщем выставил в настройках программы кодировку не cp1251, а ANCI. В итоге строка выводится на русише, НО в самом редакторе, где я кодю, эта строка каракулями))))

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1153
Регистрация: 25.11.2009

Учитывая что кроме как в строках/текстах русские символы в коде встречаться не могут, я раньше (когда не было наших индикаторов с удобной кодовой страниицей) делал хитрее: перед компиляцией исходного кода весь его перекодировал таблично самописным препроцессором (фактически из четырёх команд: открыть файл, циклом по всем символам преобразовать их по таблице, записать в другой файл и закрыть). Т.е. компилятору отдавался уже переконверченный исходник, а в редакторе оставался в желаемом виде. Правда не в Unicode конечно. Хотя и с ним на компе особых проблем нет, разумеется не таблично, а через функции перекодировки WinAPI (типа WideCharToMultiByte(1251, ...);), взять от неё младший байт (с проверкой старших на 0) и кажется получится то что нужно. Во всяком случае на компе на стадии компиляции это сделать намного легче чем в микроконтроллере.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение
Сейчас на форуме (гостей: 9, пользователей: 0 , из них : 0 )