Могу ли я проверить, успешно ли отправлено сообщение, используя Radiohead_ASK?

Я новичок в программировании Arduino и пытаюсь получить простой модуль передатчика и приемника 433 МГц, работающий на плате Arduino Uno. Неудивительно, что он не работает должным образом, и я пытаюсь устранить проблему.

Я использую RadioHead и прочитал в документацию, что send() и waitPacketSent () возвращают логическое значение, указывающее на успех. Однако я отключил провод данных, и метод send() по-прежнему возвращает значение true. Поскольку модуль больше не подключен к Arduino, я ожидал, что он вернет false.

Я понимаю, что сообщения отправляются как ненадежные дейтаграммы, но я просто пытаюсь выяснить, действительно ли отправитель что-то отправил. Можно ли как-то это сделать?

Код, который я использую, относительно короткий, поэтому я включил его полностью ниже, поскольку он того стоит

#include <RH_ASK.h>
#include <RadioHead.h>

#ifdef RH_HAVE_HARDWARE_SPI
#include <SPI.h> // На самом деле не используется, но необходим для компиляции
#endif

RH_ASK driver;

bool sent;

void setup()
{
#ifdef RH_HAVE_SERIAL
    Serial.begin(9600);    // Только отладка
#endif
    if (!driver.init())
#ifdef RH_HAVE_SERIAL
      Serial.println("init failed");
#else
  ;
#endif
  sent = false;
}

void loop()
{
    uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
    uint8_t buflen = sizeof(buf);

    const char *msg = "hello";
    bool sendSuccess;
    bool waitSuccess;
    
    if (!sent) {
      Serial.println("sending");
      sendSuccess = driver.send((uint8_t *)msg, strlen(msg));
      if (sendSuccess) {
        Serial.println("Send completed successfully");
      } else {
        Serial.println("Send Error");
      }
      Serial.println("Waiting");
      
      waitSuccess = driver.waitPacketSent();
      if (waitSuccess) {
        Serial.println("Wait Sent Success");
      } else {
        Serial.println("Wait Sent Error");
      }
      Serial.println("Done Sending");
      sent = true;
      delay(1000);
    }
    
    if (driver.recv(buf, &buflen)) // Неблокирующий
    {
      Serial.println("driver.recv");

      // Получено сообщение с хорошей контрольной суммой, дамп.
      driver.printBuffer("Got:", buf, buflen);
    }
}

Вывод на серийный монитор выглядит следующим образом

22:22:30.647 --> отправка

22:22:30.647 --> Отправка успешно завершена

22:22:30.684 --> Ожидание

22:22:30.753 --> Подождите, успешно отправлено

22:22:30.753 --> Отправка завершена

Заранее спасибо!

, 👍0


1 ответ


Лучший ответ:

1

Не существует понятия "пришел ли пакет", есть только "был ли он отправлен" - и под "отправлен" я подразумеваю данные, выдаваемые из вывода данных для отправки подключенным модулем.

Эти модули 433 МГц тупые. Очень глупо. Вы переключаете контакт передатчика на высокий и низкий уровень, и приемник видит это переключение, если он находится в пределах досягаемости, и переключает свой выходной контакт для отражения сигнала.

Вы можете узнать, прибыл ли пакет, только если у получателя есть передатчик, а у передатчика есть приемник. Когда сообщение поступает на принимающий узел, он отправляет сообщение обратно на передающий узел, чтобы сказать: «Я понял». Это требует много работы, чтобы получить право, хотя. Тем более, что исходное сообщение могло быть доставлено в порядке, но подтверждение не пришло, и могут произойти всевозможные ужасные вещи, если вы неправильно обрабатываете последовательность пакетов.

Лучше выбрать лучший модуль, который сделает все это за вас, например, nRF24L01+ с включенным Auto-ACK.

,

Маженко спасибо за быстрый ответ! Я знаю, что у меня нет никакого способа проверить, пришли ли пакеты. Я просто отлаживаю в данный момент и пытаюсь проверить, было ли оно отправлено. Я бы подумал, что, поскольку контакт данных не подключает Arduino к модулю передатчика, send() должен завершиться ошибкой? Я неправильно понял это?, @Jack O'Neill

Вы неправильно это поняли. Arduino не знает, что подключено. Там ничего нет, контакт данных все еще переключается. Если в лесу падает дерево, и никто не слышит этого, дерево все равно падает, и воздух все еще вибрирует., @Majenko

Ах хорошо. Спасибо, что прояснили это. Спасибо также за рекомендацию. Проверим модуль, который вы упомянули выше., @Jack O'Neill

Получите второй Arduino и дайте ему получить сигнал вывода данных. Тогда вы узнаете, что сигнал создается. Вы не можете отправлять и получать с одним Arduino, вам нужен второй. Я думаю, что некоторые данные будут обернуты вокруг отправленного сообщения; некоторые байты синхронизации, некоторое заполнение, чтобы обеспечить достаточное количество переходов «высокий/низкий» и «низкий/высокий», чтобы гарантировать, что все данные распознаются на принимающей стороне. На веб-страницах Radiohead это обсуждается более подробно. Это в основном Software Serial, но с радиомодулями, застрявшими посередине., @CrossRoads

@CrossRoads Спасибо. В этом была проблема. Я пытался отправить и получить с одной и той же платы. Когда я получил второй Arduino в качестве приемника, он работал, как и ожидалось., @Jack O'Neill