VirtualWire `vw_get_message`: документация и примеры на сайте PJRC

virtualwire

Я просматриваю следующую страницу, на которой описаны функции из библиотеки VirtualWire и приведены некоторые примеры.

https://www.pjrc.com/teensy/td_libs_VirtualWire.html

Некоторые основные вопросы, которые у меня возникли после прочтения:

  1. Описание состояний функции vw_get_message.

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

    «3 функции выше» относятся к функциям vw_have_message, vw_wait_rx и vw_wait_rx_max.

    Однако в примере на той же странице функция vw_get_message вызывается из loop() получателя без каких-либо попыток сначала вызвать какую-либо из этих трех функций.< /п>

    Почему? Законно ли использовать vw_get_message отдельно? И как это работает в данном случае, т.е. какова семантика возвращаемого значения?

    Функция явно описана как неблокирующая, очевидно, подразумевая, что, если ее использование законно, невозможно отличить ситуацию «поврежденное сообщение» от ситуации «нет сообщения».

  2. Сохраняет ли библиотека детализацию/разделение сообщений? Т.е. если сторона TX отправляет 1-байтовые сообщения, гарантирует ли она, что каждый вызов vw_get_message на стороне RX будет возвращать 1-байтовые сообщения? Вроде бы это подразумевается из описания протокола, но хотелось бы на всякий случай спросить.

  3. Если ответ на второй вопрос «да», то сохраняет ли этот API сообщения нулевой длины? Или их сразу выбрасывают?

, 👍0

Обсуждение

http://www.airspayce.com/mikem/arduino/VirtualWire/, @Juraj


1 ответ


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

1
  1. Пример только с vw_get_message — это обычное использование библиотеки VirtualWire. Он возвращает true, если что-то было получено и контрольная сумма в порядке.

  2. Да, каждое сообщение отделено от других сообщений. Каждое сообщение получает дополнительные биты (вступительные биты) и дополнительные байты (контрольную сумму и длину).

  3. Не знаю, я никогда этого не проверял. Глядя на исходный код, можно увидеть, что с сообщениями нулевой длины проблем нет.

Библиотека 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