Кодировка win-1251

Renome
Offline
Зарегистрирован: 05.07.2015

Добрый день!

Сегодня с толкнулся со следующей проблемой.

Есть конечное оборудование, которое подключено к ардуино через serial.

Как оказалось, оборудование обменивается данными только в кодировке win-1251.

К примеру команду в виде - FE FE 5E E0 03 FD оборудвание понимает только в таком виде - юю^аэ

На указанную команду оборудвание должно дать ответ примерно следующего содержания - FE FE E0 5E 03 78 56 34 12 00 FD

Если сторонней терминальной программой отправлять комманду в кодировке win-1251 (юю^аэ) то от оборудвания приходит красивый ответ в вышеуказанном виде FE FE E0 5E 03 78 56 34 12 00 FD

Теперь пытаясь написать скетч, в котором ардуино должна каждую секунду отправлять комманду в виде юю^аэ и анализировать ответ оборудования, столкнулся с проблемой, что указанную комманду, ардуино кодирует по своему и соответственно она доходит до оборудвания в измененном виде и как следствие ответа нет ((((.

Прошу подсказать, как к примеру комманду юю^аэ отправить через ардуино на оборудвание в неизменном виде, т.е. в кодировке win-1251 и соответственно полученный ответ привести в читабельный вид - E FE E0 5E 03 78 56 34 12 00 FD.

Спасибо!

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

Нет такой команды.

Команда может быть FE FE E0 5E 03 78 56 34 12 00 FD, вот ее и отправляйте.

Arduino IDE использует кодировку utf-8.

Лично я советую Вам забыть об идее передавать команды символами кириллицы в текстовом виде. Пользуйтесь либо таблицей ASCII (коды с 0 по 7F), либо передавайте в двоичном виде. Но если очень хочется общаться текстом, нужно как следует разобраться с кодировками, что в случае с utf-8 не является тривиальным, т.к. 1251 - однобайтовая кодировкка, а utf-8 - кодировка с символами переменной длины.

Renome
Offline
Зарегистрирован: 05.07.2015

Если отправляю команду через терминальную программу в виде FE FE E0 5E оборудование ее не воспринимает, воспринимает только комманду в виде кириллических символов...

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

 

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

Еще раз: никакой кодировке при отправке команд не используется. Команды - двоичные. То, что вся длинная команда оказалась состоящей из допустимых байтов 1251 станицы - чистая случайность. (может, и не случайность - разработчтки подстраховались для возможности использования стандартного терминала)

Но если Вы пишете скетч, Вам нужно забыть про кодировки и отправлять обычные числа. В языках С/С++ они записываются как  0xFE, 0xFE, 0xE0, 0x5E. И, собственно, это все, что Вам нужно.

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

Renome пишет:

это грабли оборудования китайского.

Да, нет, это грабли Ваших рук и мозгов. Вы не понимаете разницы между числом в машинном формате и его текстовым представлением. Вам же andriano объяснил, что нужно посылать соответсвующие коды, а Вы посылаете текстовые символы.