Могу ли я проверить, успешно ли отправлено сообщение, используя 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 --> Отправка завершена
Заранее спасибо!
@Jack O'Neill, 👍0
1 ответ
Лучший ответ:
Не существует понятия "пришел ли пакет", есть только "был ли он отправлен" - и под "отправлен" я подразумеваю данные, выдаваемые из вывода данных для отправки подключенным модулем.
Эти модули 433 МГц тупые. Очень глупо. Вы переключаете контакт передатчика на высокий и низкий уровень, и приемник видит это переключение, если он находится в пределах досягаемости, и переключает свой выходной контакт для отражения сигнала.
Вы можете узнать, прибыл ли пакет, только если у получателя есть передатчик, а у передатчика есть приемник. Когда сообщение поступает на принимающий узел, он отправляет сообщение обратно на передающий узел, чтобы сказать: «Я понял». Это требует много работы, чтобы получить право, хотя. Тем более, что исходное сообщение могло быть доставлено в порядке, но подтверждение не пришло, и могут произойти всевозможные ужасные вещи, если вы неправильно обрабатываете последовательность пакетов.
Лучше выбрать лучший модуль, который сделает все это за вас, например, nRF24L01+ с включенным Auto-ACK.
- Как передать 2 параметра с помощью библиотеки RCSwitch?
- Радиочастотный сниффер с Arduino
- RF Keyfob простой код кнопки
- CC1101 Проблемы с приемом и передачей
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
Маженко спасибо за быстрый ответ! Я знаю, что у меня нет никакого способа проверить, пришли ли пакеты. Я просто отлаживаю в данный момент и пытаюсь проверить, было ли оно отправлено. Я бы подумал, что, поскольку контакт данных не подключает Arduino к модулю передатчика, send() должен завершиться ошибкой? Я неправильно понял это?, @Jack O'Neill
Вы неправильно это поняли. Arduino не знает, что подключено. Там ничего нет, контакт данных все еще переключается. Если в лесу падает дерево, и никто не слышит этого, дерево все равно падает, и воздух все еще вибрирует., @Majenko
Ах хорошо. Спасибо, что прояснили это. Спасибо также за рекомендацию. Проверим модуль, который вы упомянули выше., @Jack O'Neill
Получите второй Arduino и дайте ему получить сигнал вывода данных. Тогда вы узнаете, что сигнал создается. Вы не можете отправлять и получать с одним Arduino, вам нужен второй. Я думаю, что некоторые данные будут обернуты вокруг отправленного сообщения; некоторые байты синхронизации, некоторое заполнение, чтобы обеспечить достаточное количество переходов «высокий/низкий» и «низкий/высокий», чтобы гарантировать, что все данные распознаются на принимающей стороне. На веб-страницах Radiohead это обсуждается более подробно. Это в основном Software Serial, но с радиомодулями, застрявшими посередине., @CrossRoads
@CrossRoads Спасибо. В этом была проблема. Я пытался отправить и получить с одной и той же платы. Когда я получил второй Arduino в качестве приемника, он работал, как и ожидалось., @Jack O'Neill