Разбор входящей строки (команда из двух параметров), парсинг Serial
- Войдите на сайт для отправки комментариев
Вс, 27/08/2017 - 13:05
Добавляю возможность изменять параметры программы из консоли Serial, путем ввода двух команд, по примеру: набрали "FAN 48" - вентилятор сменил обороты, набрали "BAUD 9600" - скорость обмена по RS-485 изменилась на 9600 и т.п.
void serialEvent() // функция с таким именем системная, вызывается автоматически как только в Serial приходят данные, т.е. в loop() ее прописывать не нужно. Не работает в Esplora, Leonardo, Micro { #define DELIMITER " ,.-" // символы, возможные в качестве разделителя const byte bufLen = 32; // ограничение длины входящего сообщения char buffer[bufLen]; byte i = 0; // длина введенной строки delay(32); // ожидаем приема всей строки if (Serial.available() < 5) return; // отсеивает короткие сообщения while (Serial.available() && i < bufLen - 1) buffer[i++] = Serial.read(); //загоняем прочитанное в буфер buffer[i] = '\0'; //закрываем массив // разбиваем строку на подстроки по разделителю char *p = buffer; char *cmd = strtok_r(p, DELIMITER, &p); // первая подстрока - команда unsigned long value = strtok_r(p, DELIMITER, &p); // первая подстрока - значение // Входящая строка корректно разделяется на команду и значение, для проверки: Serial.printf("cmd: |%s|\n", cmd); Serial.printf("value: %s\n", value); if (*cmd == "FAN") // <-- это не работает {
Почему не выполняется сравнение if (cmd == "FAN")?
Почему не выполняется сравнение if (cmd == "FAN")?
Я правильно понял, что, по крайней мере, с даты регистрации 09.03.2013 Вы, так или иначе, изучаете програмирование на С?
То есть более 4-х лет? Круто, чё!
----
Ответ на Ваш вопрос - пототому, что и не должно работать. Вот совсем никак. Для сравнения строк существуют функции.
strcmp() и strncmp(), для примера.
ну, потому, что
13
char
*cmd = strtok_r(p, DELIMITER, &p);
// первая подстрока - команда
14
unsigned
long
value = strtok_r(p, DELIMITER, &p);
// первая подстрока - значение
char // это символ, а не строка
unsigned
long // это число, а не строка
здесь #76 посмотри, как я собирал приходящие символы в строку и сравнивал ея с чем-то.
Ага, но я не изучаю C++ целенаправленно. Возникла потребность что-то сделать - сел и сделал. А потом несколько месяцев бездействия. И так сложилось, что за эти годы ни разу не приходилось плотно работать с указателями и ссылками ;) Я тут больше читатель, а не программист.
И так сложилось, что за эти годы ни разу не приходилось плотно работать с указателями и ссылками ;)
а, зачем ты их тут используешь?
надо же когда-то начинать, чтобы понять как оно работает.
Вчера разобрался как это сделать через String.subString и через sscanf_P, но они по отзывам довольно ресурсоемкие, поэтому погружаюсь глубже.
Tomasina, вот вы и добрались до строчных переменных. О них надо знать главное. Без них просто нельзя обойтись. Но в отличии от обычных переменных у них своя специфика. Но эта специфика еще различается до и после появления классов в Си. После появления классов появился класс String(), методы которые позволяют работать как с обычными переменными людям далеких от программирования.http://scrutator.me/post/2014/09/02/cpp_strings_basics.aspx
Ну чистых Си http://younglinux.info/c/strings
ПС: И еще в ардуино есть это dyn_string_t , но с этим я еще не работал