Как вызвать 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 голоса | спросил Ravi Parmar 23 +03002017-10-23T09:03:10+03:00312017bEurope/MoscowMon, 23 Oct 2017 09:03:10 +0300 2017, 09:03:10

2 ответа


2

Этот ответ не даст вам код для решения вашей проблемы, это просто идеи, на которые вы можете посмотреть и посмотреть, что вам лучше всего подходит.

Вы можете найти пример того, как читать из последовательного соединения, я уверен, что в среде IDE есть хотя бы один пример.

Вам нужно решить, как закодировать ваши данные, имея в хорошем дружественном для человека формате (например, вы уже выше) отлично, если вы обрабатываете его на ПК, но на медленном процессоре и имеете очень ограниченную память, используя A, B, C ... поскольку имена функций могут быть более практичными. Он будет меньше, чтобы хранить и быстрее сравнивать.

Вы хотите сохранить ввод, чтобы его можно было прочитать позже. Есть несколько способов сделать это, но всем им нужен энергонезависимый носитель данных. Вы можете использовать SD-карту, очевидно, вам нужен SD-считыватель, и тип читателя, который вы получите, повлияет на код, который вам нужен, но это может быть проблематично. Вы также можете использовать чипы EEPROM, которые могут получить небольшие интерфейсные модули I2C, у них меньше места, чем у SD-карты, но, как правило, они быстрее (у них также есть более короткий срок службы, но не беспокойтесь, один из). Вы также можете использовать EEPROM, который находится в самом Arduino (я этого никогда не делал).

Лучше всего создать программу в небольших частях, получить чтение из последовательной работы, затем вызвать функции, а затем сохранить и загрузить. Таким образом, вам нужно только сразу отладить небольшую кучу проблем. Если вы хотите, вы можете абстрагировать устройство хранения от кода, написав базовый класс, который имеет функции виртуального сохранения и загрузки. Затем вы можете наследовать этот класс для EEPROM или SD-карты, и изменение не повлияет на остальную часть кода.

Как я уже сказал в начале, я ценю, что этот ответ не дал вам пошагового руководства о том, как решить вашу проблему, но, надеюсь, он дал вам несколько указаний на то, что вы могли бы сделать, и вы можете исследовать варианты оттуда. Помните, когда вы застряли в одном конкретном аспекте, просто разместите минимальный пример того, что вы попробовали, и объясните, что вы ожидаете от этого, и люди будут более чем готовы помочь.

ответил Code Gorilla 23 +03002017-10-23T10:13:40+03:00312017bEurope/MoscowMon, 23 Oct 2017 10:13:40 +0300 2017, 10:13:40
1

Этот ответ также не даст вам код для решения вашей проблемы, это просто трюки, на которые вы можете посмотреть, и посмотреть, что вам подходит.

[Я предполагаю, что ваш последовательный ввод - это все читаемый текст (нет двоичных данных).]

Формат последовательного ввода фиксированного формата: каждое имя функции имеет длину 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 (строки, тексты), поместите их в качестве последнего параметра. Вам понадобится третья функция для чтения строки переменной длины до конца строки (или какого-либо выбранного маркера).

ответил 23 +03002017-10-23T12:20:30+03:00312017bEurope/MoscowMon, 23 Oct 2017 12:20:30 +0300 2017, 12:20:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132