Arduino:Примеры/SendandReceive

Материал из Онлайн справочника
Версия от 00:35, 14 декабря 2016; Myagkij (обсуждение | вклад) (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


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

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

Код

// *** Получение и отправка команд ***

// Это расширенная версия примера «Получение команд». В него
// добавлено то, что Arduino теперь отсылает обратно статус 
// светодиода. 
//
// Этот скетч демонстрирует, как: 
// - обрабатывать входящие команды, к которым не привязаны функции 
// - отправлять на PC команду с аргументом

#include <CmdMessenger.h>  // CmdMessenger

// переменные для мигающего светодиода: 
bool ledState                   = 0;   // текущее состояние светодиода
const int kBlinkLed             = 13;  // контакт для встроенного светодиода

// привязываем экземпляр класса CmdMessenger к последовательному порту:
CmdMessenger cmdMessenger = CmdMessenger(Serial);

// Это список распознаваемых команд, и эти команды могут быть 
// либо получены, либо отправлены. Чтобы получить команду, к этому 
// событию нужно привязать функцию внешнего вызова.
enum
{
  kSetLed              , // команда, запрашивающая переключение светодиода в определенное состояние
  kStatus              , // команда для сообщения статуса светодиода
};

// функции внешнего вызова, определяющие, при получении каких команд нам нужно начинать действовать:
void attachCommandCallbacks()
{
  // подключаем функции внешнего вызова:
  cmdMessenger.attach(OnUnknownCommand);
  cmdMessenger.attach(kSetLed, OnSetLed);
}

// эта функция вызывается, когда к присланной команде не привязано никакой функции: 
void OnUnknownCommand()
{
  cmdMessenger.sendCmd(kStatus,"Command without attached callback");  //  "Команда без функции внешнего вызова"
}

// функция внешнего вызова, включающая/выключающая светодиод:
void OnSetLed()
{
  // считываем присланный аргумент, интерпретируем строку как boolean:
  ledState = cmdMessenger.readBoolArg();
  // задаем состояние светодиода:
  digitalWrite(kBlinkLed, ledState?HIGH:LOW);
  // отсылаем обратно статус, описывающий состояние светодиода:
  cmdMessenger.sendCmd(kStatus,(int)ledState);
}

// блок исходных операций:
void setup() 
{
  // прослушиваем последовательное соединение на предмет сообщений от PC:  Serial.begin(115200); 

  // добавляем каждой команде символ новой строки:
  cmdMessenger.printLfCr();   

  // подключаем функции внешнего вызова, заданные пользователем:
  attachCommandCallbacks();

  // отсылаем на PC сообщение о загрузке Arduino; также обратите 
  // внимание, что это хороший способ отладки – эта функция даст 
  // знать, если в скетче есть баг и Arduino была перезапущена:
  cmdMessenger.sendCmd(kStatus,"Arduino has started!");  //  "Arduino запущена!"

  // режим работы светодиода выставляем на OUTPUT:
  pinMode(kBlinkLed, OUTPUT);
}

// блок повторяющихся операций:
void loop() 
{
  // обрабатываем данные, пришедшие по последовательному соединению,
  // и выполняем функции внешнего вызова:
  cmdMessenger.feedinSerialData();
}

См.также

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