Как вызвать 5 различных функций в цикле на основе последовательного ввода?
У меня есть 5 типов таких функций с разными входными параметрами.
blink(int a,char* b, int c);
fade(int a,int b,int c);
split(int a,int d);
и т. д. от последовательного ввода, я хочу назвать эти три функции в любых комбинациях, которые могут быть позже выполнены в цикле. Например, мой последовательный вход - это.
[blink(a,b,c),fade(a,b,c),blink(a,b,c),fade(a,b,c),split(a,d),blink(a,b,c)]
Код также должен быть сохранен в памяти, так что когда человек сбросит Arduino. Порядок выполнения функций выполняется без ожидания последовательного ввода. Порядок функций будет изменяться только тогда, когда пользователь вводит последовательные данные в arduino. Я не знаю, с чего начать, пожалуйста, помогите мне.
2 ответа
Этот ответ не даст вам код для решения вашей проблемы, это просто идеи, на которые вы можете посмотреть и посмотреть, что вам лучше всего подходит.
Вы можете найти пример того, как читать из последовательного соединения, я уверен, что в среде IDE есть хотя бы один пример.
Вам нужно решить, как закодировать ваши данные, имея в хорошем дружественном для человека формате (например, вы уже выше) отлично, если вы обрабатываете его на ПК, но на медленном процессоре и имеете очень ограниченную память, используя A, B, C ... поскольку имена функций могут быть более практичными. Он будет меньше, чтобы хранить и быстрее сравнивать.
Вы хотите сохранить ввод, чтобы его можно было прочитать позже. Есть несколько способов сделать это, но всем им нужен энергонезависимый носитель данных. Вы можете использовать SD-карту, очевидно, вам нужен SD-считыватель, и тип читателя, который вы получите, повлияет на код, который вам нужен, но это может быть проблематично. Вы также можете использовать чипы EEPROM, которые могут получить небольшие интерфейсные модули I2C, у них меньше места, чем у SD-карты, но, как правило, они быстрее (у них также есть более короткий срок службы, но не беспокойтесь, один из). Вы также можете использовать EEPROM, который находится в самом Arduino (я этого никогда не делал).
Лучше всего создать программу в небольших частях, получить чтение из последовательной работы, затем вызвать функции, а затем сохранить и загрузить. Таким образом, вам нужно только сразу отладить небольшую кучу проблем. Если вы хотите, вы можете абстрагировать устройство хранения от кода, написав базовый класс, который имеет функции виртуального сохранения и загрузки. Затем вы можете наследовать этот класс для EEPROM или SD-карты, и изменение не повлияет на остальную часть кода.
Как я уже сказал в начале, я ценю, что этот ответ не дал вам пошагового руководства о том, как решить вашу проблему, но, надеюсь, он дал вам несколько указаний на то, что вы могли бы сделать, и вы можете исследовать варианты оттуда. Помните, когда вы застряли в одном конкретном аспекте, просто разместите минимальный пример того, что вы попробовали, и объясните, что вы ожидаете от этого, и люди будут более чем готовы помочь.
Этот ответ также не даст вам код для решения вашей проблемы, это просто трюки, на которые вы можете посмотреть, и посмотреть, что вам подходит.
[Я предполагаю, что ваш последовательный ввод - это все читаемый текст (нет двоичных данных).]
Формат последовательного ввода фиксированного формата: каждое имя функции имеет длину 3 буквы, все параметры имеют одинаковую длину, и, если возможно, все функции имеют одинаковое количество параметров. Это упростит синтаксический анализ, а затем вы можете обновить до параметров переменной длины.
Знайте, что вы можете написать две небольшие функции, которые читают Serial и возвращают один элемент:
String getFunction();
int getArgument();
Каждая функция позаботится о запятых и других разделителях. Кроме того, getArgument
преобразует значения как текст в двоичные значения.
Цикл будет выглядеть как (псевдо-код, не компилируется).
void loop() {
String fn = getFunction();
if (fn.equals("blink")) {
doBlink();
}
if (fn.equals("fade")) {
doFade();
}
....
}
void doBlink() {
int val1 = readArgument();
int val2 = readArgument();
int val3 = readArgument();
// Do some blink.
}
void doFade() {
// same thing.
}
}
Теперь, если вы хотите передать данные char (строки, тексты), поместите их в качестве последнего параметра. Вам понадобится третья функция для чтения строки переменной длины до конца строки (или какого-либо выбранного маркера).