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

Arduino:Примеры/Echo Callbacks

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

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

Контакты:

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


Прослушка входящих пакетов и отправка идентичных ответов[1]

Этот пример показывает, как при помощи библиотеки XBee настроить прослушку входящих пакетов, а затем отправлять всю полученную информацию обратно.

Код

  1. /**
  2.  * Автор – Мэттхиджс Куиджман (Matthijs Kooijman). 2015 год, все права защищены.
  3.  *
  4.  * Этот файл – часть библиотеки XBee-Arduino.
  5.  *
  6.  * Библиотека XBee для Arduino – это бесплатное ПО: его можно
  7.  * распространять и/или модифицировать согласно условиям Универсальной
  8.  * общественной лицензии GNU, изданной Фондом свободного ПО – будь то
  9.  * 3-тья или более поздняя версия этой лицензии (на ваш выбор).
  10.  *
  11.  * Библиотека XBee-Arduino распространяется бесплатно в надежде на то,
  12.  * что окажется полезной, но БЕЗО ВСЯКОЙ ГАРАНТИИ; включая даже
  13.  * обязательную гарантию на КОММЕРЧЕСКОЕ КАЧЕСТВО и ПРИГОДНОСТЬ
  14.  * КОНКРЕТНОЙ ЦЕЛИ. Более подробно читайте в Универсальной
  15.  * общественной лицензии GNU.
  16.  *
  17.  * Вы должны получить копию Универсальной общественной лицензии GNU
  18.  * вместе с библиотекой XBee-Arduino. Если не получили, ее можно найти
  19.  * на http://www.gnu.org/licenses/.
  20.  */
  21.  
  22. #include <XBee.h>
  23. #include <Printers.h>
  24.  
  25. /*
  26.  Этот пример – для XBee-модуля Series 1 или Series 2 (изменения в
  27.  прошивке не требуются).
  28.  
  29.  Он прослушивает входящие пакеты, а затем отправляет всю полученную
  30.  информацию обратно. Этот пример демонстрирует, как при помощи объекта
  31.  XBeeWithCallbacks лаконично осуществить чтение ответных пакетов.
  32.  
  33.  Кроме того, этот скетч рассчитан на то, что вы используете Arduino с
  34.  двумя последовательными портами (вроде Leonardo или Mega). Замените
  35.  Serial и Serial1 ниже на то, что соответствует вашей плате.
  36. */
  37.  
  38. // Создаем объект XBeeWithCallbacks:
  39. XBeeWithCallbacks xbee;
  40.  
  41. void zbReceive(ZBRxResponse& rx, uintptr_t) {
  42.   // Создаем ответный пакет, содержащий те же данные.
  43.   // При этом напрямую используется массив RX-данных, что нормально,
  44.   // поскольку TX-пакет отправляется перед получением какого-либо
  45.   // нового ответа.
  46.   ZBTxRequest tx;
  47.   tx.setAddress64(rx.getRemoteAddress64());
  48.   tx.setAddress16(rx.getRemoteAddress16());
  49.   tx.setPayload(rx.getFrameData() + rx.getDataOffset(), rx.getDataLength());
  50.  
  51.   // Шлем ответ, но не ждем TX-ответа о статусе. Если возникнет
  52.   // ошибка, глобальный обработчик onTxStatusResponse покажет
  53.   // сообщение об ошибке, но при успехе никакого сообщения показано
  54.   // не будет.
  55.   xbee.send(tx);
  56.   Serial.println(F("Sending ZBTxRequest"));  //  "Отправка ZBTxRequest"
  57. }
  58.  
  59. void receive16(Rx16Response& rx, uintptr_t) {
  60.   // Создаем ответный пакет, содержащий те же данные.
  61.   // При этом напрямую используется массив RX-данных, что нормально,
  62.   // поскольку TX-пакет отправляется перед получением какого-либо
  63.   // нового ответа.
  64.   Tx16Request tx;
  65.   tx.setAddress16(rx.getRemoteAddress16());
  66.   tx.setPayload(rx.getFrameData() + rx.getDataOffset(), rx.getDataLength());
  67.  
  68.   // Шлем ответ, но не ждем статусного TX-ответа. Если возникнет
  69.   // ошибка, глобальный обработчик onTxStatusResponse покажет
  70.   // сообщение об ошибке, но при успехе никакого сообщения показано
  71.   // не будет.
  72.   xbee.send(tx);
  73.   Serial.println(F("Sending Tx16Request"));  //  "Отправка Tx16Request"
  74. }
  75.  
  76. void receive64(Rx64Response& rx, uintptr_t) {
  77.   // Создаем ответный пакет, содержащий те же данные.
  78.   // При этом напрямую используется массив RX-данных, что нормально,
  79.   // поскольку TX-пакет отправляется перед получением какого-либо
  80.   // нового ответа.
  81.   Tx64Request tx;
  82.   tx.setAddress64(rx.getRemoteAddress64());
  83.   tx.setPayload(rx.getFrameData() + rx.getDataOffset(), rx.getDataLength());
  84.  
  85.   // Шлем ответ, но не ждем статусного TX-ответа. Если возникнет
  86.   // ошибка, глобальный обработчик onTxStatusResponse покажет
  87.   // сообщение об ошибке, но при успехе никакого сообщения показано
  88.   // не будет.
  89.   xbee.send(tx);
  90.   Serial.println(F("Sending Tx64Request"));  //  "Отправка Tx64Request"
  91. }
  92. void setup() {
  93.   Serial.begin(9600);
  94.  
  95.   Serial1.begin(9600);
  96.   xbee.setSerial(Serial1);
  97.  
  98.   // Делаем так, чтобы все ошибки записывались в Serial. Адрес Serial
  99.   // сначала приводим к Print* (т.к. это то, чего ожидает
  100.   // функция внешнего вызова), а затем к uintptr_t (чтобы подогнать
  101.   // его к параметру данных):
  102.   xbee.onPacketError(printErrorCb, (uintptr_t)(Print*)&Serial);
  103.   xbee.onTxStatusResponse(printErrorCb, (uintptr_t)(Print*)&Serial);
  104.   xbee.onZBTxStatusResponse(printErrorCb, (uintptr_t)(Print*)&Serial);
  105.  
  106.   // Эти функции вызываются при получении пакета:
  107.   xbee.onZBRxResponse(zbReceive);
  108.   xbee.onRx16Response(receive16);
  109.   xbee.onRx64Response(receive64);
  110.  
  111.   // Показываем все необработанные ответы с правильным форматированием:
  112.   xbee.onOtherResponse(printResponseCb, (uintptr_t)(Print*)&Serial);
  113.  
  114.   // Показываем «сырые» байты для всех ответов перед их обработкой:
  115.   //xbee.onResponse(printRawResponseCb, (uintptr_t)(Print*)&Serial);
  116.  
  117.   // Задаем AO=0, чтобы убедиться, что мы получили ZBRxResponses, а не
  118.   // ZBExplicitRxResponses (поддерживается только на Series 2).
  119.   // Возможно, это не потребуется, но зато отлично показывает, как
  120.   // использовать sendAndWait().
  121.   uint8_t value = 0;
  122.   AtCommandRequest req((uint8_t*)"AO", &value, sizeof(value));
  123.   req.setFrameId(xbee.getNextFrameId());
  124.   // Отправляем команду и ждем ответа в течение 150 миллисекунд:
  125.   uint8_t status = xbee.sendAndWait(req, 150);
  126.   if (status == 0)
  127.     Serial.println(F("Set AO=0"));  //  "Задаем AO=0"
  128.   Else
  129.     Serial.println(F("Failed to set AO (this is expected on series1)"));  //  "Не удалось задать AO=0" (такое происходит на Series 1"
  130. }
  131.  
  132. void loop() {
  133.   // Приказываем XBee-модулю постоянно считывать пакеты и вызывать
  134.   // функции внешнего вызова:
  135.   xbee.loop();
  136. }

См.также

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

  1. github.com - Echo_Callbacks.ino