Функция отправки VirtualWire
Я немного не понимаю, как именно работает функция отправки VirtualWire. Посмотрев на код, я понял, что процесс выглядит следующим образом.
- В Arduino IDE вызовите
vw_send()
с правильными параметрами. - В рамках этого метода он начнет кодировать сообщение и создать пакет.
- Затем перед возвратом функция вызывает
vw_tx_start()
. - Внутри этой функции она включает оборудование передатчика и устанавливает для переменной "vw_tx_enabled" значение true. Затем эта функция возвращается, за которой следует немедленный возврат
vw_send()
. Таким образом, в этом потоке нет места, где на самом деле отправляется сообщение.
Однако фактическая передача сообщения происходит внутри vw_Int_Handler()
. Но эта функция никогда не вызывается в vw_send()
или vw_tx_start()
. Таким образом, единственный способ, которым это могло бы произойти, - это если бы была какая-то правильная многопоточность? Потому что, установив для vw_tx_enabled значение true, процесс передачи начнется внутри vw_Int_Handler.
Может ли кто-нибудь объяснить/разъяснить это?
Более того, эта библиотека использует digitalWrite для передачи битов. Не было бы быстрее переключать биты на уровне реестра?
Наконец, в VirtualWire они отправляют 36-битную преамбулу, я предполагаю, что это для целей синхронизации. Итак, если я хочу отправить пакет длиной 128 байт, какую часть преамбулы мне следует использовать? Я считаю, что причина того, что VirtualWire передает только 27-байтовый пакет, заключается в том, что 36-битная преамбула будет поддерживать синхронизацию данных только в течение этого времени. Так есть ли определенная формула, используемая для определения размера преамбулы?
@Jonathan, 👍0
1 ответ
Лучший ответ:
Однако фактическая передача сообщения происходит внутри vw_Int_Handler(). Но эта функция никогда не вызывается в vw_send() или vw_tx_start(). Таким образом, единственный способ, которым это могло бы произойти, - это если бы была какая-то правильная многопоточность? Поскольку, установив для vw_tx_enabled значение true, процесс передачи начнется внутри vw_Int_Handler.
Функция vw_Int_Handler
вызывается из обработчика прерывания одного из модулей таймера в микросхеме. Да, вы могли бы сказать, что это была своего рода многопоточность в том смысле, что она чередуется с основной обработкой вашего скетча.
Более того, эта библиотека использует digitalWrite для передачи битов. Не будет ли быстрее переключать биты на уровне реестра?
Да, это было бы так, но это было бы менее портативно. VirtualWire был написан для работы с широким спектром чипов, и низкоуровневый доступ к портам усложнил бы код примерно в 1000 раз, так как пришлось бы включать специальный код для каждого чипа, на котором он работает. Проще (хотя и менее эффективно) просто использовать digitalWrite()
.
Наконец, в VirtualWire они отправляют 36-битную преамбулу, я предполагаю, что это для целей синхронизации. Итак, если я хочу отправить пакет длиной 128 байт, какую часть преамбулы мне следует использовать? Я считаю, что причина того, что VirtualWire передает только 27-байтовый пакет, заключается в том, что 36-битная преамбула будет поддерживать синхронизацию данных только в течение этого времени. Так есть ли определенная формула, используемая для определения размера преамбулы?
VirtualWire использует систему кодирования под названием 4b/6b (фактически подмножество кодирования 5b/6b). В этой системе для передачи 4 битов требуется 6 символов. Это достаточно эффективный способ кодирования часов в сигнал.
Система кодирования означает, что в сообщении никогда не может быть 36 чередующихся битов 1/0. Этот уникальный поток используется в качестве синхронизации, потому что его нельзя спутать ни с чем другим. С этого момента это просто данные, закодированные как 4b/6b. Ограничение на то, сколько данных может быть передано в одном пакете, является чисто произвольным значением. Поскольку это низкоскоростной протокол для устройств с низким энергопотреблением, ожидается, что они будут иметь ограниченную оперативную память и, следовательно, ограниченное пространство для приема данных. Таким образом, небольшие пакеты используются по умолчанию.
Кстати, используемые числа были выбраны потому, что они очень хорошо вписываются в схему кодирования 4b/6b. Например, 36 символов преамбулы эквивалентны 24 битам данных. Размер пакета составляет 30 байт, три байта из которых используются для управляющей информации (контрольная сумма, количество байтов и т. д.), а 27 байтов — фактическая полезная нагрузка. 30 байтов — это 240 бит, то есть в формате 4b/6b 360 символов. 360 символов можно аккуратно упаковать в 45 байтов для простой передачи (предварительное кодирование из двоичного в 4b/6b перед передачей).
Другие значения не подходят так точно.
- Arduino считывает состояние подключения устройства hc-05
- Как связаться с GPS SIM900a без serial monitor
- Как написать библиотеку, которая поддерживает как последовательную связь HW, так и SW и позволяет пользователю выбирать, какую из них использовать?
- Можно ли использовать контакт RX в качестве TX?
- Какой лучший способ объявить Serial при создании библиотеки Arduino?
- Невозможно получить данные при использовании нескольких SoftSerial на Arduino Nano.
- Странная проблема с software serial
- Последовательная связь между nodemcu и Arduino Uno