Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 7. Система команд АVR 1 95 Можно размещать отдельные знаки (или строку в виде отдельных знаков) в форме символьного представления : . dЬ ' Н ' , ' е ' , ' 1 ' , ' 1 ' , ' о ' , ' \\ ' , ' n ' ; последние два символа - то же , что ' \n ' Наконец, можно все представить просто в виде чисел, руководствуясь таблицей ASCII : . dЬ $ 4 8 , $ 65 , $ 6C , $ 6C , $ 6F, $ 0A Здесь $ 4 8 (72) - АSСП-код заглавной «Н», $ 65 ( 1 0 1 ) - АSСП-код строчной «е» и т. д., а символ с кодом $ 0А ( 1 0) есть АSСП-символ перевода строки. Таблицу ко дов спецсимволов (вроде «\n») можно найти в руководстве по АVR-ассемблеру. Но все так просто, пока мы находимся в пределах 1 27 символов таблицы ASCII . В ней нет уже, например, значка градуса, а с национальными алфавитами наступает полный мрак. Если вы написали свою программу приема через последовательный порт (см. главу 15), то можете воспользоваться на обоих концах какой-нибудь определенной таблицей русских кодировок (например, Windows- 1 25 1 или ср866) и быть тогда уверенным, что русский текст отобразится адекватно. Но даже в этом случае в ассемблерном тексте нельзя будет изобразить русский текст напрямую, как в двух первых примерах. Тут применим только способ прямого указания ко дов - можно так, как в последнем примере - просто цифрами, а можно в виде шестнадцатеричных ( \хсо = 1 92 = русская буква «А», \хво .= 1 76 = значок градуса «0») или восьмеричных ( \ 3 0 0, \2 60) кодов: dЬ. ' Т ' , ' \355 ' , "ар " , ' = ' , ' ' , " 30 " , ' \2 60 ' , ' С ' Эта последовательность воспроизведет на приемном конце строку «Тнар = 3 0 °С» в кодировке Windows- 1 25 1 . Для экономии записи здесь русские буквы заменены английскими, если они совпадают по написанию, т. е. в. нашем случае все кроме буквы «ю> (восьмеричный код \3 5 5) . ПОДРОБНОСТИ В Arduino, кстати , при передаче через последовательный порт проблема ровно такая же - при попытке передать через Serial строку, записанную в тексте русскими буква ми , в мониторе порта отобразятся «кракозябры» . Этой проблемы не было в первых версиях Arduino (до 1 .0 включительно) , потому что текстовый редактор там работал в однобайтовой кодировке Windows- 1 25 1 , и через контроллер русские символы пере давались адекватно. Потом все текстовые редакторы дружно перешли на Uniсоdе стандарт, точнее, на его более экономичную версию UTF-8 , в которой , как уже говори лось, символы из таблицы ASC l l остались однобайтовыми и одинаковы в любой коди ровке, а вот русские буквы nредставляются уже двухбайтовыми символами. Но В-раз рядные контроллеры ничего о двухбайтовых символах не знают, и попытка передать русский текст напрямую в львиной доле случаев накрывается медным тазом . Конечно, никто не мешает вам послать вместо одного символа два байта подряд (таблица UTF-8 не секрет) , но никогда не знаешь, как на это отреагируют на приемном конце: то ли правильно интерпретируют, как единый двухбайтовый символ , то ли просто как два отдельных символа , которые ничего не означают. По этим причинам для передачи через последовательный порт русских символов приходится либо в каждом отдельном случае изобретать свое решение, либо в це лях универсальности вовсе отказаться от русского алфавита. Кстати, редактор
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==