Побуквенная обработка вводимого текста через COM порт.

vat712
Offline
Зарегистрирован: 24.07.2020

Добрый день, уважаемые форумчане!
Поршу помощи:

Как можно реализовать на базе Atmega328P через COM порт обработку вводимого текста так, чтобы ардуинка понимала вводимый текст не как целый "неделимый пакет", а как отдельные символы?
Для чего это всё и что собственно хочу реализовать:

Есть матрица 8х8 , которую подключаю через драйвер MAX7219. Задача: Вводить в COM порт строчку целого текста (Например, "Hello world"), чтобы МК сам разбирал введенную строчку на отдельные символы и присваивал их значения переменным, для дальнейшего распознавания их из уже заранее определенного массива букв для вывода на матрицу.

b707
Offline
Зарегистрирован: 26.05.2017

vat712 пишет:

Как можно реализовать на базе Atmega328P через COM порт обработку вводимого текста так, чтобы ардуинка понимала вводимый текст не как целый "неделимый пакет", а как отдельные символы?

так ведь ардуина его и принимает посимвольно - команда Serial.read() читает по одному символу за раз.

Обычно новички мучаются с обратной задачей - как собрать обратно то, что пришло отдельными байтами :)

rkit
Offline
Зарегистрирован: 23.11.2016

Может ты прочитаешь основы работы, прежде чем придумывать какие-то неделимые пакеты?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vat712 пишет:
чтобы ардуинка понимала вводимый текст не как целый "неделимый пакет"
А она так понимает? Блин, век живи ... Спасибо, буду знать.

vat712
Offline
Зарегистрирован: 24.07.2020

Согласен, был не прав, товарищи!
МК воспринимает каждый символ в Юникоде, в UTF-8, присваивая каждому символу русских букв два байта. Так для буквы "П"  значения будут - 208, 159.

Теперь у меня возник следующий вопрос - из описания Serial.print() "Передает данные через последовательный порт как ASCII текст. Эта функция может принимать различные типы данных. Так целые числа выводятся соответствующими им символами ASCII. Вещественные выводятся с помощью двух ASCII символов, для целой и дробной части. Байты передаются как символ с соответствующим номером. Симоволы и строки отсылаются как есть"

т.е. COM порт "понимает" кирилицу по UTF-8 и выдает два байта информации, а выводить может только ASCII текст? Как зная кодировку кириллицы выслать в COM порт понятный для него формат буквы?

rkit
Offline
Зарегистрирован: 23.11.2016

Ничего кроме байтов там не передается. Как их интерпретировать - это на твое усмотрение.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vat712 пишет:

т.е. COM порт "понимает" кирилицу по UTF-8 и выдает два байта информации, а выводить может только ASCII текст? Как зная кодировку кириллицы выслать в COM порт понятный для него формат буквы?

COM-порту абсолютно пофиг что через него передаётся. Не пофиг может быть принимающей программе.

Кому Вы это передаёте?

Если ардуиновскому монитору порта, и при этом у Вас современная IDE, то просто пишите

Serilal.println("И какого хрена я стал спрашивать на форуме, не попробовав сам?");

любуйтесь на результат в мониторе порта и не выносите мозг ни себе, ни другим.

Если же Вы передаёте какой-то другой программе, то найдите в сети функцию utf8rus и пользуйте на здоровье.

vat712
Offline
Зарегистрирован: 24.07.2020

Не важно для какой цели мне это. На самом деле, вопрос озвученный мной был прост - как имея код кириллицы в UTF-8 (два байта) вывести их в СOM порт так, чтобы он его понял и вывел в саму Arduino IDE соответствующий символ. 

Вот есть у меня кодировка трёх символов в кириллице по UTF-8: 208, 165; 208,163; 208, 153; Как их вывести через Serial.println()? Коллега выше написал уже что никак. Serial.println() воспринимает только один байт по ASCII.

b707
Offline
Зарегистрирован: 26.05.2017

я вижу у ТС сознание абсолютно незамутнено какими-то знаниями :) не завидую тому. кто попытается ему обьяснить разницу между байтами и битами :)

nik182
Offline
Зарегистрирован: 04.05.2015

Зато два serial.print выдадут два аски кода или символа или байта.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vat712 пишет:

Вот есть у меня кодировка трёх символов в кириллице по UTF-8: 208, 165; 208,163; 208, 153; Как их вывести через Serial.println()? 

Я Вам написал

ЕвгенийП пишет:

Если же Вы передаёте какой-то другой программе, то найдите в сети функцию utf8rus и пользуйте на здоровье.

Вы не умеете читать? Или не можете в гугле имя функции вбить?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

b707 пишет:

я вижу у ТС сознание абсолютно незамутнено какими-то знаниями :) не завидую тому. кто попытается ему обьяснить разницу между байтами и битами :)

Зато есть задача! Нисколько не удивлюсь, что задачу препод поставил...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vat712, ни в Си, ни в Си++ нет адекватных типов данных для работы в кодировке utf-8.

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

rkit
Offline
Зарегистрирован: 23.11.2016

andriano пишет:

ни в Си, ни в Си++ нет адекватных типов данных для работы в кодировке utf-8.

Нет типов для работы с байтовыми последовательностями? Ну приехали.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

andriano пишет:

ни в Си, ни в Си++ нет адекватных типов данных для работы в кодировке utf-8.

wchar_t

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DetSimen пишет:

andriano пишет:

ни в Си, ни в Си++ нет адекватных типов данных для работы в кодировке utf-8.

wchar_t

Это для utf-16.

arduinec
Offline
Зарегистрирован: 01.09.2015

ЕвгенийП пишет:
найдите в сети функцию utf8rus и пользуйте на здоровье.

Зачем в сети? Эта функция на форуме почти 5 лет назад выложена:
http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...