Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/SendandReceive

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Получение и отправка команд[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. }

См.также

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

  1. github.com - SendAndReceive.ino