Я пришел к программированию в целом, и программированию Arduino в частности, полным нулем, около двух месяцев назад. Сейчас же, по ходу своей текущей деятельности я ощутил необходимость в освоении обработки строк на ардуино. Обычный поход в Google за информацией не обрадовал статьей, где все просто и понятно для чайников написано. И поэтому я здесь для того, чтобы рассказать о том, каким образом был реализован парсинг строк из последовательного порта и какие были встречены на пути подводные камни. Интересующихся прошу под кат.
Итак. Вот примерный алгоритм, которому я следовал:
- Идем на arduino.ru и высматриваем в колонке типов все, связанное с символами.
- Решаем, какую форму представления будем использовать (Я остановился на классе String, т.к. имел неприятный опыт с
месивоммассивом). Судорожно пытаемся написать свою функцию с преферансом и профурсетками- Ищем подробное описание класса.
- Ищем нужные операторы.
- Пишем!
А алгоритм работы основного тела программы прост:
- Циклично проверяем, есть ли в буфере com порта доступный для чтения байт, если есть, читаем.
- Если принятый байт — символ переноса строки (‘\n’), то вызываем самописную функцию парсинга, если же нет, то добавляем принятый байт в созданную переменную типа String.
-
Парсим, наконец, строку.На самом деле, т.к. практическое использование парсинга строк у меня не горит, то данная функция носит всего лишь демонстративный характер, сравнивая полученную строку с уже записанной в памяти константной строкой. Итак, используя оператор equals сравниваем принятую строку с записанной, и, если оператор возвращает true, выходим из функции обработчика, если же нет, сравниваем со следующей. Если строки эквивалентны, то опять же, выходим из функции-обработчика, возвращая результат. Ну а уж если и это условие не сработает, то все равно выйдем из функции и скажем, что что строка не верна.
- В зависимости от принятого результата с помощью switch case выбираем нужный.
- Обнуляем принятую строку, чтобы потом начать собирать ее заново.
#define led 13 String input_string = ""; const String Led_off = "switch led off"; const String Led_on = "switch led on"; bool led_running; void setup() { Serial.begin(9600); } void loop() { while (Serial.available() > 0) { char c = Serial.read(); if (c == '\n') { Serial.print("Input_string is: "); Serial.println(input_string); switch ( parse(input_string, Led_off, Led_on) ) { case 10: led_running=false; Serial.println("Switching off is done"); break; case 11: led_running=true; Serial.println("Switching on is done"); break; case 0: Serial.println("invalid String"); break; } input_string = ""; digitalWrite(led, led_running); } else { input_string += c; } } } byte parse(String input_string, const String Led_off, const String Led_on) { if (input_string.equals(Led_off) == true) { return 10; } else if (input_string.equals(Led_on) == true) { return 11; } else return 0; }
Так, я не понял, что за дела? Почему не загорается светодиод? Ах да, как же это я запамятовал, в void setup нужно добавить:
pinMode(led, OUTPUT);
P.S.: Немаловажно установить монитор com порта в Arduino IDE в режим «Новая строка», т.к. в любом другом посылаемая строка не будет сопровождаться символом ее окончания ‘\n’.
P.P.S.: В холиваре по поводу того, что ардуино нинужна — участвовать не собираюсь, изучая основы программирования и алгоритмизации я ничего дурного не сделал.
P.P.P.S.: Если статья будет принята адекватно, напишу следующую о том, что у меня вышло с улучшением функционала функции парсинга. Ну, с богом!.
ссылка на оригинал статьи http://geektimes.ru/post/265828/
Добавить комментарий