Arduino:Примеры/SendandReceiveBinaryArguments

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

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


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

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

Код

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

См.также

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