Библиотека Arduino RF24 Задержка после функции записи не приводит к доступности байтов

Речь идет о библиотеке RF24, которую вы можете найти здесь. http://maniacbug.github.io/RF24/index.html

Я передаю данные от одного Arduino к другому с помощью радиостанций NRF24L01. Когда я использую функцию записи на передатчике arduino (джойстик-это массив) и после этого ставлю задержку выше 10, доступная функция возвращает false.

Передатчик

radio.write( joystick, sizeof(joystick) );
delay(20);

Приемник

if(!available())
  print('No data'); // delay > 10 --> Данные не будут напечатаны

Почему он работает с задержкой 10, но не выше? Имеет ли это какое-то отношение к тайм-аутам, которые упоминаются в документах библиотеки?: http://maniacbug.github.io/RF24/classRF24.html#a4cd4c198a47704db20b6b5cf0731cd58

Спасибо вам за ваши ответы.

, 👍1

Обсуждение

Разве вы не проверяете неоднократно, чтобы увидеть, станут ли данные доступными позже? Если вы не используете прерывание от радиоприемника к процессору, вам это понадобится., @Chris Stratton

Я проверяю неоднократно в смысле стандартного цикла. Я думаю, что Arduino печатает огромное количество "Нет данных" из-за задержки. Когда задержка заканчивается, одна строка становится другой, а затем снова огромное количество строк "Нет данных". Я прокручивал Последовательный монитор, но это было не так. Или, может быть, я прокручивал недостаточно долго? Было бы интересно, сколько миллисекунд требуется для завершения небольшого цикла...Но я думаю, что это просто лучше, когда я использую: while(!radio.available ()) {}, так что только что-то происходит, когда есть полезная нагрузка. Я попробую это сделать сегодня., @mathnow

Да, обычно не полезно повторно регистрировать, что данные *недоступны*, но если вам действительно интересно, вы можете подсчитать количество циклов до тех пор, пока данные не будут получены, и распечатать их вместе с данными., @Chris Stratton

Отлично, это отличная идея. Да, мне это очень любопытно. Я поделюсь результатом после того, как попробую., @mathnow

Я считаю, что утверждение if без скобок довольно рискованно, так как его труднее читать, чем скобки. Очевидно, здесь есть еще код; можете ли вы добавить его, чтобы мы могли увидеть, есть ли еще одна проблема? Мне нравится, что вы попытались сделать его меньше, но не могли бы вы включить пример с достаточным количеством для компиляции? Спасибо! (Кстати, что это за переменная джойстика? Класс?), @Anonymous Penguin

Спасибо за комментарий. джойстик-это массив, и я скопировал учебник отсюда: http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo Просто прокрутите вниз или найдите на сайте "ПРИМЕР СКЕТЧЕЙ ARDUINO". Все, что я сделал, это повесил задержку после радио.напишите в примере YD_nRF24L01_Transmit_JoyStick, как вы можете видеть в моем первоначальном вопросе. Я с нетерпением жду вашей попытки :-), @mathnow

Это ведь фрагмент текста, не так ли? print('No data'); не будет печатать "No data", потому что вы используете неправильные кавычки. Трудно ответить на такие вопросы без публикации фактического кода., @Nick Gammon

У меня такая же проблема, и я поместил эту проблему в трекер проблем Github. надеюсь, что придет ответ: https://github.com/maniacbug/RF24/issues/68, @Greccofly

@Greccofly Ответа не будет, потому что эта библиотека была заброшена. Пожалуйста, используйте https://github.com/TMRh20/RF24 библиотека. Он также должен быть доступен во встроенном менеджере библиотек, так что вам не придется беспокоиться о его обновлении., @Avamander


5 ответов


0

Пожалуйста, прочтите это: Arduino NRF24L01+ arduino к проблеме передачи netmf
Хотя вы не используете NETMF, @PhilVallone успешно использует библиотеку и чип вместе, указывает, что образцы не являются асинхронными, и обращается к тайм-ауту. ОП для этого вопроса использует delay(1000), и ответ не был принят.

,

Я не верю, что есть какая-либо польза от прерываний или потоков, что делает это в основном неуместным. У вас есть доказательства обратного?, @Chris Stratton

Ответы должны иметь какое - то отношение к проблеме, а случайные несвязанные предложения-нет., @Chris Stratton

И какие ошибки загрузчика, по вашему мнению, могут быть *релевантными*? Понимаете ли вы, насколько самодостаточен код, о котором идет речь? Это бесполезно, это неосведомленное хватание за соломинку., @Chris Stratton

Пожалуйста, потратьте некоторое время, чтобы действительно прочитать код, связанный с вопросом..., @Chris Stratton

С вашим отзывом я вернулся назад и жду ответа ОП., @Jon


0

Попробуйте обновить свою библиотеку до новой вилки TMRh20. Это значительно улучшает старую версию maniacbug (возможно, также исправляет ошибку). tmrh20.github.io/RF24

Стоит также отметить, что после того, как вы прочитаете сообщение, оно будет выводить "нет данных" до тех пор, пока вы не получите новое сообщение.

,

1

У меня была такая же проблема. Мое решение таково:

Первый make .stopListening()

затем .write(&data, sizeof(data))

а за командой записи стоит .startListening().

Теперь вы можете откладывать на более длительное время.

,

Добро пожаловать в Arduino SE! Мне трудно понять, что вы имеете в виду. Команда stopListening() кажется полезной, хотя не могли бы вы объяснить, как поможет .write(&data, sizeof(data))? Спасибо!, @Anonymous Penguin


3

В моей ситуации проблема заключалась в том, что передатчик не продолжал передачу после задержки. Мне удалось решить эту проблему с помощью отключения питания (http://maniacbug.github.io/RF24/classRF24.html#aa0a51923a09ba4f3478aba9be0f8a6a1) и включение питания (http://maniacbug.github.io/RF24/classRF24.html#a5cdaf47aa0edd6dca1b9a8bb7972a1a3) функции. Вот фрагмент моего кода. "Радиоткс" - это название, присвоенное моему передатчику.

//стандартная настройка кода для arduino uno board examples
radioTx.begin();
radioTx.setChannel(108);
radioTx.openWritingPipe(pipe);

}

void loop() {

  int dist_cm = sonar.ping_cm();


  Serial.println(dist_cm);
  radioTx.write(&dist_cm,sizeof(dist_cm));
  radioTx.powerDown();
  delay(5000);
  radioTx.powerUp();

  }
,

1

Попробуйте использовать

unsigned long t = millis();
while(millis() - t < DELAY);

вместо "delay(DELAY)"

,