Соединение 433 MHZ между двумя Arduino (nano, uno) завершается через некоторое время

Цель этой части моего проекта - установить беспроводную связь между Arduino nano и Arduino uno. Для этого я использую приемник 433 MHZ и отправитель. Нано отправляет, uno получает и печатает. У меня есть рабочий код и работает соединение, и я могу отправлять, получать и печатать свое сообщение. Но в какой-то момент Uno получает только часть сообщения и после этого момента всегда получает (или печатает) именно эту часть сообщения:

 введите описание изображения здесь>> </a> </p>

<p> Нано (отправитель): </p>

<pre><code>---- +: = 0 = + ----</code></pre>

<p> Это не всегда 2 цифры, иногда еще больше. </p>

<p> Я искал ошибки. Нано постоянно отправляется, а uno переворачивается, чтобы не получать все сообщение. Поэтому я повторно загружаю код в uno без изменений, и он работает снова в течение нескольких секунд /минут, поэтому я думаю, что это проблема на принимающей стороне. </p>

<p> Вот мой код: </p>

<p> Отправитель (нано): </p>

<pre><code>---- +: = 1 = + ----</code></pre>

<p> Приемник (Uno): </p>

<pre><code>---- +: = 2 = + ----</code></pre>

<p> Это не происходит через определенное время или количество сообщений. Я не знаю, что может быть проблемой. </p>

<p> Спасибо заранее,
Никлас </p>

<p> Изменить: проблема кажется решенной. Изменение битрейта с 5000 до 2000 решило проблему, но я действительно не знаю почему. </p></body></html>

2 голоса | спросил Niklas 14 J000000Friday17 2017, 14:11:55

2 ответа


3

Что касается аппаратной проблемы, в комментариях есть некоторые советы. Как вы писали, решение заключается в уменьшении битрейта со скоростью 2000 бит /с.

Остается вопрос, почему приемник всегда усекает сообщение (после возникновения ошибки приема). Ответ заключается в определении параметра buflen функции vw_get_message . На странице https://www.pjrc.com/teensy/td_libs_VirtualWire.html говорится

  

«buflen» должен иметь максимальный размер массива при вводе, а после возврата сохраняется количество фактически скопированных байтов.

Поэтому, когда возникает ошибка передачи, переменная buflen возвращает меньшее число, чтобы сообщить вам, сколько символов получено. Если вы не сбросите переменную buflen в VW_MAX_MESSAGE_LEN перед вызовом vw_get_message еще раз, вы сообщаете библиотеке, что вы ожидаете меньшее количество символов, а функция соответствует этому размеру (думая, что у вас меньше буфер).

Другими словами, если вы хотите попытаться получить полное сообщение после ошибки передачи, установите переменную buflen в VW_MAX_MESSAGE_LEN перед каждым вызовом функции vw_get_message.

ответил Razvan Socol 16 J000000Sunday17 2017, 08:42:45
0

Эти дешевые радиочастотные модули 433 МГц не могут работать с высоким битрейтом. Существует много разных 433 МГц модулей, и более дорогие модули могут обрабатывать, возможно, 10 кГц.
Каждый импульс из приемника генерирует прерывание. Это означает, что и программное обеспечение должно быть в состоянии идти в ногу с ним.

Для базовой платы Arduino на частоте 16 МГц (Arduino Uno, Nano, Leonardo и т. д.) и дешевых радиочастотных модулей сладкое пятно составляет от 1 кГц до 2 кГц. 2 кГц является безопасным значением.

Частота 433 МГц в большинстве стран требует, чтобы только 1/10 времени, когда передача могла быть активной, а у VirtualWire /RadioHead были накладные расходы. Это означает, что результирующая скорость передачи данных с частотой 2 кГц будет составлять от 10 до 20 байт в секунду.

Модули приемопередатчика не имеют всех этих (смешных) ограничений. Они могут передавать данные с высокой скоростью. Модулями трансивера являются, например, модули nRF24L01 +, модули CC1101, модули RFM69 и т. Д.

ответил Jot 16 J000000Sunday17 2017, 09:24:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132