да я этим-то в принципе то и занят. Или ты имеешь ввиду, что сразу разбирать строку побайтно по мере поступления данных в буфер uarta?а не как я - сначала собрал всю строку целиком, а потом ее разбираю?
во-первых не str{2}, а str[2]. Привыкайте не допускать подобных “опечаток” - язык такое не прощает.
А во-вторых, сколько элементов вы в массиве заказали - столько и будет. Заказали два - будет два.
Ну а в третьих, если вы знали что на конце должен быть терминатор - то где он у вас в коде?
например, я, принимаю всю строку до CRLF, проверяю её CRC, ты же передаешь CRC в конце строки, надеюсь? Не совпало, ошибка чтения, строка игнорируется, совпало, храшо, ставим указатель на первый символ, отправляем парсеру, он безо всяких strtok её разбирает на допустимые лексемы, начиная сначала.
можно для чайникв - что это и как проверять?
У меня критерием правильности приема будет первое служебное сообщение и конечный символ. прием завершается по символу \n
Можешь выложить код разбора без strok?
Я читал, что strok не слишком хорошая функция- “тяжелая”. так ли это?
Например, даччик с холодного балкона передаеть
1205 - ID даччика, 6 - тенпература на балконе, дальше другие данные, неважно, пропускаем, 60, 5Е, 72 - то, что нужно добавить к CRC всех предыдущих байт, чтоб получился 0, в конце - сопственно 0. Не укладывается в данную схему, разбирать ничего не надо, строка с ошибкой.
просмотрел. учту
Наюха?
Вы говорите, что первая часть всегда две цифры? Ну, тогда первую часть читаете atoi(str)
а вторую – atoi(str+3)
и всё.
Если не всегда две, то чуть сложнее, но никакой массив опять же не нужен: первую часть читаете atoi(str)
а вторую – atoi(strchr(str, '|')+1)
.
Делов то!
Спасибо за ответы. Я уже понял из Вашего сообщения и №14, что можно сделать напрямую.
Может обьяснить как работает эта запись:atoi(str+3)?
atoi преобразует массив символов char в число.
str здесь как раз этот массив “+3” - это операция над массивом или это синтаксис функции atoi, добавляющий, что надо считать именно с 3 символа? (в описании не нашел такого)
С чего?
Никогда так не говорите! Именно это (неряшливость в терминологии) мешает Вам понимать простые вещи!
str
- никакой не массив! Это указатель на нулевой элемент массива! Как только Вы это проговорите, то тут же поймёте, что str+3
- это указатель на третий элемент массива (т.е. как раз на то, что идёт после |
).
Дошло?
Можно.
Датчик обозначается единственной буквой (26 датчиков - достаточно? А если 52?), после которой идет одна или несколько цифр записи числа.
Пример: “F123r46K14j12v9876V6789”.
Время - не исключение, его можно передавать точно так же.
Дошло!
третий день читаю тему про указатели. Сложновато конечно. Нет, вроде все понятно, но все-равно
Если понимать, что это указатель на адрес нулевого элемента, +3 мы перемещаемся по массиву и начинаем его считывать с +3 элемента!
очень удобно!
Те, другими словами, если бы я задал массив так: str[6] = { ‘1’,‘2’,‘3’,‘4’,‘5’,‘\0’};
то запись бы str +3 вызвала бы ошибку, верно?
И так же оперируя с указателем на массив я могу обратиться к определенным элементам, чтобы получить нужные данные?
11T12:23
atoi(str+3) - даст часы
atoi(str+5) - даст минуты

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

Те, другими словами, если бы я задал массив так: str[6] = { ‘1’,‘2’,‘3’,‘4’,‘5’,‘\0’};
то запись бы str +3 вызвала бы ошибку, верно?
почему? Откуда ошибка-то?

Те, другими словами, если бы я задал массив так: str[6] = { ‘1’,‘2’,‘3’,‘4’,‘5’,‘\0’};
то запись бы str +3 вызвала бы ошибку, верно?
Ошибка здесь - спрашивать о таких вещах, вместо того, чтобы просто взять и попробовать.
Не было бы там никакой ошибки. str+3
- указывал бы на символ ‘4’, т.к. он третий. Всё просто и не выдумывайте лишних сложностей.