Skip to content

Instantly share code, notes, and snippets.

@dubkov dubkov/func.ino
Created Nov 11, 2016

Embed
What would you like to do?
Arduino func array
// допустим, функций три. Заведем макрос с количеством функций,
// чтобы потом при смене количества было меньше ошибок
#define FUNC_NUM 3
// Напишем прототипы функций.
// Определения функций напишем потом внизу,
// чтобы они здесь не мозолили глаза
void f1(void);
void f2(void);
void f3(void);
// Теперь создадим три указателя
// и присвоим им адреса функций
void (*pf1)(void) = &f1;
void (*pf2)(void) = &f2;
void (*pf3)(void) = &f3;
// Прежде, чем сложить указатели в массив,
// нам придется создать для него тип.
// Вот мы создаем тип с названием FuncPtr
// который представляет собой указатель на функцию :)
typedef void (* FuncPtr) ();
// Теперь создадим массив длиной три
// и сложем в него указатели на функции.
// Массив имеет тип, который мы только что создали
FuncPtr funcArray[FUNC_NUM] = {pf1, pf2, pf3};
// Здесь всё понятно
void setup(){
Serial.begin(19200);
}
// А это переменная - счетчик функций.
// Она должна инкрементироваться каждый раз,
// когда приходит единица в юарт
// (ну и сбрасываться в ноль когда надо)
int i = 0;
// Тут пока всё понятно
void loop(){
if (Serial.available()){
if (Serial.read() == '1'){
// Обращаемся к текущему элементу массива,
// тем самым делая вызов функции по очереди
funcArray[i]();
// Это тернарный оператор. Он проверяет на истинность
// выражение после знака = и перед знаком ?.
// если оно истинно, то переменной присваивается значение
// после знака ?, если ложно - то значение после знака :.
// здесь он нужен, чтобы листать индекс массива от 0 до
// длины массива минус один.
i = (i < FUNC_NUM-1) ? i+1 : 0;
}
}
}
// А вот и описания функций.
// Они все вместе должны написать в порт
// интересное сообщение, когда ты пришлешь 3 единицы
void f1(){
Serial.println("PACANI");
}
void f2(){
Serial.println("VASCHE");
}
void f3(){
Serial.println("REBYATA");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.