Всем привет!
Очередной раз пытаюсь задать вопрос на форуме, но по мере подготовки материала, ответ находится, и спрашивать уже нечего))
Так же и в этот раз. Долго я возился с написанием “ногодрыга” для передачи по UART , не понимая, где моя ошибка, и почему в разных эмуляторах терминала получаю разные данные. Но всё оказалось проще:
разные программы для работы с последовательным портом воспринимают некоторые управляющие символы по разному, и никакие настройки здесь не помогут! (Если я не прав, прошу меня опровергнуть)
В общем, здесь я изобрёл велосипед, но всё же решил выложить свой “горький опыт”, может кому и пригодится.
Настройки, насколько они доступны, одинаковые
Подобный разнобой замечен с символами ‘\0’ и ‘\t’ . Больше проверять не стал, т.к. три - это уже “система”))
Я переформулирую это утверждение так, чтобы оно было верным:
В разных ОС для обозначения конца строки используются разные комбинации символов, программы, предназначенные для работы в разных ОС, соответственно, ведут себя по-разному.
В ASCII традиционно использовалось два символа:
CR (13) - возврат каретки - для перевода каретки к началу текущей строки,
LF (10) - перевод строки - для перехода на следующую строку без изменения колонки.
В одних ОС для обозначения конца строки нужно применять оба эти символа, в других - достаточно какой-то один из них. Т.е. всего три варианта: CRLF(DOS/Win), CR(старые версии MAC OS) и LF(Unix).
Вот это не очень понятно. Если в программе-терминале есть настройки касающиеся концов строк, то они должны работать (иначе нафиг такую глючную программу). Если настроек нет, то нужно просто знать, что данный терминал ожидает в качестве конца строки и слать именно это, а не что Вам захотелось (или не пользуйтесь таким терминалом).
На самом деле все проще.
Пользуйся println вместо того, чтобы вручную вводить управляющие последовательности (особенно когда не очень представляешь, как они работают), и будет тебе счастье.
Да, можно принудительно добавить, скажем возврат каретки, и новую строку после каждого символа . Но не получится заставить
прочитать ‘\n’ , если программа его в упор не видит как отдельный упр. символ
Пока что мы видим обратное: нужно CRLF, а вместо этого вручную вставляется только LF.
Если бы ТС понимал, что для чего нужно, этой темы бы не появилось.
Единственный символ \0 превращается в длинную цепочку символов?
Что-то Вы явно не то делаете.
Вообще по стандарту ASCII нулевой символ должен игнорироваться. Это еще со времен перфоленты - чистая лента без дырочек - это отсутствие каких-либо символов.
Вывод, мне кажется, простой: нефиг пользоваться программами, которые не понимаешь, как работают.
В частности, вообще не нужно пользоваться эмуляторами Ардуино.
Ну а по части соблюдения стандарта:
Полностью выполняет стандарт ASCII putty.
Arduino IDE работает в стандарте unix.
Остальные программы работают неверно (вероятно реакция заимствована из “упрощенной” для DOS) .
Может, не надо переваливать на Arduino IDE свои ошибки?
Символ с кодом 0 вообще не должен появляться в передаваемом сообщении. Притом, сразу по двум причинам:
Этот код является в языке Си служебным - сигнализирует о конце строки. И в этом качестве передаваться никак не должен.
В ASCII это означает отсутствие символа.
Другими словами: Вы пихаете в текст символы, которые там не должны появляться, а потом хотите, чтобы на эту явно нештатную ситуацию все программы реагировали единообразно.