VirtualWire `vw_get_message`: документация и примеры на сайте PJRC
Я просматриваю следующую страницу, на которой описаны функции из библиотеки VirtualWire и приведены некоторые примеры.
https://www.pjrc.com/teensy/td_libs_VirtualWire.html
Некоторые основные вопросы, которые у меня возникли после прочтения:
Описание состояний функции
vw_get_message
.Прочитайте последнее полученное сообщение. Это следует вызывать только в том случае, если известно, что сообщение получено с помощью любой из трех функций, указанных выше.
«3 функции выше» относятся к функциям
vw_have_message
,vw_wait_rx
иvw_wait_rx_max
.Однако в примере на той же странице функция
vw_get_message
вызывается изloop()
получателя без каких-либо попыток сначала вызвать какую-либо из этих трех функций.< /п>Почему? Законно ли использовать
vw_get_message
отдельно? И как это работает в данном случае, т.е. какова семантика возвращаемого значения?Функция явно описана как неблокирующая, очевидно, подразумевая, что, если ее использование законно, невозможно отличить ситуацию «поврежденное сообщение» от ситуации «нет сообщения».
Сохраняет ли библиотека детализацию/разделение сообщений? Т.е. если сторона TX отправляет 1-байтовые сообщения, гарантирует ли она, что каждый вызов
vw_get_message
на стороне RX будет возвращать 1-байтовые сообщения? Вроде бы это подразумевается из описания протокола, но хотелось бы на всякий случай спросить.Если ответ на второй вопрос «да», то сохраняет ли этот API сообщения нулевой длины? Или их сразу выбрасывают?
@AnT, 👍0
Обсуждение1 ответ
Лучший ответ:
Пример только с
vw_get_message
— это обычное использование библиотеки VirtualWire. Он возвращаетtrue
, если что-то было получено и контрольная сумма в порядке.Да, каждое сообщение отделено от других сообщений. Каждое сообщение получает дополнительные биты (вступительные биты) и дополнительные байты (контрольную сумму и длину).
Не знаю, я никогда этого не проверял. Глядя на исходный код, можно увидеть, что с сообщениями нулевой длины проблем нет.
Библиотека VirtualWire устарела, хотя она до сих пор используется с платами Arduino с небольшим объемом памяти (Arduino Uno, Nano, Leonardo, Pro Mini и т. д.).
Библиотека RadioHead (www.airspayce.com/mikem/arduino/RadioHead) включила протокол VirtualWire в состав Режим RH_ASK. Примеры режима RH_ASK показывают, что его использование практически одинаково. Библиотеку RadioHead следует использовать при наличии большего количества памяти (Arduino MKR, Zero, Due и т. д.).
Это имеет смысл, спасибо. Кстати, кто-то упомянул в комментариях (сейчас удаленных), что такое использование, вероятно, приведет к тому, что vw_get_message
будет читать *одно и то же* сообщение (и возвращать true
) снова и снова при каждом вызове, пока не будет получено новое сообщение для замены предыдущий. Знаете ли вы, так ли это?, @AnT
Нет, это не так. Полученное сообщение используется только один раз. Если вы посмотрите исходный код, для этого используется флаг vw_rx_done. Флаг устанавливается в значение true, когда данные получены, а vw_get_message устанавливает для него значение false, чтобы указать, что новые данные были прочитаны., @Jot
- Радиочастотное дистанционное управление с использованием VirtualWire на ATtiny85, работающем на частоте 8 МГц на внутреннем генераторе
- RCSwitch на Attiny85
- 433 МГц отправка не принимается
- Функция отправки VirtualWire
- Проблема с клавиатурой Arduino и радиочастотным передатчиком 433 МГц
- FS100A работает, когда Arduino подключен к ПК, но не работает при подключении к Raspberry Pi.
- Как написать программу на Arduino, которая соединяет один Rx с несколькими модулями Tx?
http://www.airspayce.com/mikem/arduino/VirtualWire/, @Juraj