Я пришел к программированию в целом, и программированию 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.: Если статья будет принята адекватно, напишу следующую о том, что у меня вышло с улучшением функционала функции парсинга. Ну, с богом!.
Автор: proudmore