Arduino:Примеры/SendandReceive
Перейти к навигации
Перейти к поиску
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.
Получение и отправка команд[1]
Этот пример является расширенной версией примера «Получение команд», то есть демонстрирует, как сделать на PC переключатель светодиода, встроенного в Arduino, но вдобавок к этому – то, как отправлять обратно на PC статус, в котором в данный момент находится светодиод.
Код
1 // *** Получение и отправка команд ***
2
3 // Это расширенная версия примера «Получение команд». В него
4 // добавлено то, что Arduino теперь отсылает обратно статус
5 // светодиода.
6 //
7 // Этот скетч демонстрирует, как:
8 // - обрабатывать входящие команды, к которым не привязаны функции
9 // - отправлять на PC команду с аргументом
10
11 #include <CmdMessenger.h> // CmdMessenger
12
13 // переменные для мигающего светодиода:
14 bool ledState = 0; // текущее состояние светодиода
15 const int kBlinkLed = 13; // контакт для встроенного светодиода
16
17 // привязываем экземпляр класса CmdMessenger к последовательному порту:
18 CmdMessenger cmdMessenger = CmdMessenger(Serial);
19
20 // Это список распознаваемых команд, и эти команды могут быть
21 // либо получены, либо отправлены. Чтобы получить команду, к этому
22 // событию нужно привязать функцию внешнего вызова.
23 enum
24 {
25 kSetLed , // команда, запрашивающая переключение светодиода в определенное состояние
26 kStatus , // команда для сообщения статуса светодиода
27 };
28
29 // функции внешнего вызова, определяющие, при получении каких команд нам нужно начинать действовать:
30 void attachCommandCallbacks()
31 {
32 // подключаем функции внешнего вызова:
33 cmdMessenger.attach(OnUnknownCommand);
34 cmdMessenger.attach(kSetLed, OnSetLed);
35 }
36
37 // эта функция вызывается, когда к присланной команде не привязано никакой функции:
38 void OnUnknownCommand()
39 {
40 cmdMessenger.sendCmd(kStatus,"Command without attached callback"); // "Команда без функции внешнего вызова"
41 }
42
43 // функция внешнего вызова, включающая/выключающая светодиод:
44 void OnSetLed()
45 {
46 // считываем присланный аргумент, интерпретируем строку как boolean:
47 ledState = cmdMessenger.readBoolArg();
48 // задаем состояние светодиода:
49 digitalWrite(kBlinkLed, ledState?HIGH:LOW);
50 // отсылаем обратно статус, описывающий состояние светодиода:
51 cmdMessenger.sendCmd(kStatus,(int)ledState);
52 }
53
54 // блок исходных операций:
55 void setup()
56 {
57 // прослушиваем последовательное соединение на предмет сообщений от PC: Serial.begin(115200);
58
59 // добавляем каждой команде символ новой строки:
60 cmdMessenger.printLfCr();
61
62 // подключаем функции внешнего вызова, заданные пользователем:
63 attachCommandCallbacks();
64
65 // отсылаем на PC сообщение о загрузке Arduino; также обратите
66 // внимание, что это хороший способ отладки – эта функция даст
67 // знать, если в скетче есть баг и Arduino была перезапущена:
68 cmdMessenger.sendCmd(kStatus,"Arduino has started!"); // "Arduino запущена!"
69
70 // режим работы светодиода выставляем на OUTPUT:
71 pinMode(kBlinkLed, OUTPUT);
72 }
73
74 // блок повторяющихся операций:
75 void loop()
76 {
77 // обрабатываем данные, пришедшие по последовательному соединению,
78 // и выполняем функции внешнего вызова:
79 cmdMessenger.feedinSerialData();
80 }
См.также
Внешние ссылки