addi II 0 28 мая, 2021 Опубликовано 28 мая, 2021 · Жалоба Здравствуйте! Не могу разобраться с одним моментом. Есть необходимость передавать с одного интерфейса в другой строковые команды, например "accd123,345,*11\r\n"(без ковычек) Проблема возникает с последними символами конца и перевода строки \r\n. При приеме я их распознаю и заканчиваю прием. Прием делаю посредствам char *. Далее я их передаю другому указателю и фактически передаю только accd123,345,*11. \r\n заканчивают и переводят строку. когда как мне нужно передать их как символы строки. Я попытался посредством передачи принимаемых данных в массив добавить mas[max] = ''\0' Но что-то не выходит. При этом когда я просто передаю строковую команду самостоятельно(без ее приема) вот так mas[] = "accd123,345,*11\r\n", то все ок. Прошу подсказать как правильно форматировать(в процессе буферизации)в этом случае прием чтобы передать строку такой как она пришла Спасибо! . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
heavyC1oud 0 29 мая, 2021 Опубликовано 29 мая, 2021 (изменено) · Жалоба 7 часов назад, addi II сказал: когда как мне нужно передать их как символы строки. не очень понятно требование, эти символы имеют коды 0x0D - \r возврат каретки и 0x0A - \n перевод строки, именно так они передаются в виде однобайтовой величины, отобразить их можно либо в виде этого значения именно как числа, либо в виде самих действий возврата каретки и переноса строки, что и делают терминалы, воспринимающие данные как строки, т.е. символов на экране не появится, но положение курсора изменится 7 часов назад, addi II сказал: При этом когда я просто передаю строковую команду самостоятельно(без ее приема) вот так mas[] = "accd123,345,*11\r\n", то все ок. предположу, что "все ок", это на терминале выводится указанная строка, если перевести ее в hex, то причинные символы \r и \n будут отображаться двумя байтами каждый, т.е. символ слеша '\' это 0x5C и символ 'r' это 0x72 или 'n' это 0x6E. Т.е. чтобы у вас на терминале отобразить управляющие символы в виде строковых значений, вам нужно заменить один байт управляющего символа на два байта его строкового отображения, например для \r, заменить 0x0D на 0x5C и 0x72 Изменено 29 мая, 2021 пользователем heavyC1oud Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 29 мая, 2021 Опубликовано 29 мая, 2021 · Жалоба 8 часов назад, addi II сказал: Не могу разобраться с одним моментом. Лучше выкладывайте кусок кода, который, по-Вашему мнению, должен работать, но не работает. Эскейп-последовательности - это такие же символы, как, например, символы букв и цифр. Они имеют свои коды в таблице ASCII. Но для консолей принято соглашение, что экскейп-последовательности выводятся не символьно, а совершают какие-то действия, например, '\n' переводит курсор на новую строку, '\r' - возвращает каретку в начало строки. Если, как уже отметил @heavyC1oud, прямо из консоли печатается строка "accd123,345,*11\r\n", то Вы примете все символы, включая '\', 'r', '\', 'n', '\0' в конце. Для консоли достаточно ввести "accd123,345,*11" и нажать Enter, хотя в некоторых можно настроить, что отправлять по Enter (LR, CR, LR + CR). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться