Arduino:Примеры/SendandReceiveArguments

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

Перевод: Максим Кузьмин (Cubewriter) Перевел 364226 статей для сайта.</br>Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Получение и отправка команд с аргументами[1]

Этот пример является расширенной версией примера «Получение и отправка команд», то есть демонстрирует, как сделать на PC переключатель светодиода, встроенного в Arduino, а также как отправлять обратно на PC статус, в котором в данный момент находится светодиод, но вдобавок к этому – как отправлять и принимать несколько аргументов в виде значений типа float.

Код

  1 // *** Получение и отправка команд с аргументами ***
  2 
  3 // Это расширенная версия примера «Получение и отправка команд». 
  4 // В него добавлено то, что Arduino теперь отправляет и принимает
  5 // несколько float-значений.
  6 //
  7 // Этот скетч демонстрирует, как:
  8 // - возвращать разные статусы (команды подтверждения и ошибки)
  9 // - получать несколько аргументов
 10 // - отправлять несколько аргументов
 11 // - вызывать функцию периодически
 12 
 13 #include <CmdMessenger.h>  //  подключаем библиотеку CmdMessenger
 14 
 15 // переменные для мигающего светодиода: 
 16 unsigned long previousToggleLed = 0;   // то, когда светодиод был переключен в последний раз
 17 bool ledState                   = 0;   // текущее состояние светодиода
 18 const int kBlinkLed             = 13;  // контакт для встроенного светодиода
 19 
 20 // привязываем экземпляр класса CmdMessenger к последовательному порту:
 21 CmdMessenger cmdMessenger = CmdMessenger(Serial);
 22 
 23 // Это список распознаваемых команд, и эти команды могут быть 
 24 // либо получены, либо отправлены. Чтобы получить команду, к этому 
 25 // событию нужно привязать функцию внешнего вызова.
 26 enum
 27 {
 28   // Команды:
 29   kAcknowledge         , // команда, подтверждающая получение команды
 30   kError               , // команда, сообщающая об ошибках
 31   kFloatAddition       , // команда, запрашивающая суммировать два float-значения
 32   kFloatAdditionResult , // команда, сообщающая о результате суммирования
 33 };
 34 
 35 // команды, отсылаемые от PC и получаемые на Arduino; в скетче Arduino 
 36 // нужно задать функцию внешнего вызова для каждой записи из списка ниже:
 37 void attachCommandCallbacks()
 38 {
 39   // подключаем функции внешнего вызова:
 40   cmdMessenger.attach(OnUnknownCommand);
 41   cmdMessenger.attach(kFloatAddition, OnFloatAddition);
 42 }
 43 
 44 // ------------------  ФУНКЦИИ ВНЕШНЕГО ВЫЗОВА -----------------------
 45 
 46 // эта функция вызывается, когда к присланной команде не привязано никакой функции:
 47 void OnUnknownCommand()
 48 {
 49   cmdMessenger.sendCmd(kError,"Command without attached callback");  //  "Команда без функции внешнего вызова" 
 50 }
 51 
 52 // функция внешнего вызова, сообщающая о готовности Arduino (т.е. о ее загрузке):
 53 void OnArduinoReady()
 54 {
 55   cmdMessenger.sendCmd(kAcknowledge,"Arduino ready");  //  "Arduino готова"
 56 }
 57 
 58 // функция внешнего вызова, рассчитывающая сумму двух присланных float-значений:
 59 void OnFloatAddition()
 60 {
 61   // извлекаем первый аргумент как float:
 62   float a = cmdMessenger.readFloatArg();
 63   
 64   // извлекаем второй аргумент как float:
 65   float b = cmdMessenger.readFloatArg();
 66   
 67   // отсылаем обратно результат суммирования:
 68   //cmdMessenger.sendCmd(kFloatAdditionResult,a + b);
 69   cmdMessenger.sendCmdStart(kFloatAdditionResult);
 70   cmdMessenger.sendCmdArg(a+b);
 71   cmdMessenger.sendCmdArg(a-b);
 72   cmdMessenger.sendCmdEnd();
 73 }
 74 
 75 // ------------------ ГЛАВНАЯ ЧАСТЬ СКЕТЧА ----------------------
 76 
 77 // блок исходных операций:
 78 void setup() 
 79 {
 80   // прослушиваем последовательное соединение на предмет сообщений от PC:
 81   Serial.begin(115200); 
 82 
 83   // добавляем каждой команде символ новой строки:
 84   cmdMessenger.printLfCr();   
 85 
 86   // подключаем функции внешнего вызова, заданные пользователем:
 87   attachCommandCallbacks();
 88 
 89   // отсылаем на PC сообщение, что Arduino загрузилась:
 90   cmdMessenger.sendCmd(kAcknowledge,"Arduino has started!");  //  "Arduino запущена!"
 91 
 92   // режим работы светодиода выставляем на OUTPUT:
 93   pinMode(kBlinkLed, OUTPUT);
 94 }
 95 
 96 // возвращаем «true», если время превысило заданный интервал 
 97 // (в миллисекундах); используется для периодических действий:
 98 bool hasExpired(unsigned long &prevTime, unsigned long interval) {
 99   if (  millis() - prevTime > interval ) {
100     prevTime = millis();
101     return true;
102   } else     
103     return false;
104 }
105 
106 // блок повторяющихся операций:
107 void loop() 
108 {
109   // обрабатываем данные, пришедшие по последовательному соединению,
110   // и выполняем функции внешнего вызова:
111   cmdMessenger.feedinSerialData();
112 
113   // периодически переключаем светодиод; если светодиод
114   // не переключается каждые 2000 миллисекунд, это значит, что работа 
115   // cmdMessenger требует больше времени: 
116   if (hasExpired(previousToggleLed,2000)) // переключаем каждые 2 секунды:
117   {
118     toggleLed();  
119   } 
120 }
121 
122 // состояние переключаемого светодиода: 
123 void toggleLed()
124 {  
125   ledState = !ledState;
126   digitalWrite(kBlinkLed, ledState?HIGH:LOW);
127 }

См.также

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