Arduino:Примеры/SendandReceive

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Перевел 364226 статей для сайта.</br>Контакты:</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 }

См.также

Внешние ссылки