nRF24L01+ : побеждаем модуль.

Тема в разделе "Проводная и беспроводная связь", создана пользователем ИгорьК, 19 июн 2014.

  1. И опять, NRF вешает arduino. Если выключить nrf в момент выполнения программы, он вешает всю плату. Хелп !!!!!!!!!!!!!!!!
     
  2. может памяти нехватает?
     
  3. ИгорьК

    ИгорьК Гуру

    Это как Вы делаете то?
    NRF общается с платой по интерфейсу SPI. Не может он вешать ничего. Может не передать что-то. Вешает программу Ваш код.
     
    Пушной звер нравится это.
  4. geher

    geher Гуру

    Теоретически это может быть в случае, когда где-то имеется бесконечный цикл ожидания отклика от NRF. Естественно ардуина "зависнет" на этом цикле, если NRF отключен, поскольку не сможет дождаться этого события.
    Что-то вроде
    while (!radio.available()) {}
    Возможен и другой вариант, но это совсем экзотика - возникающая при отключении NRF помеха по питанию, приводящая к побочным эффектам, например, к "зависанию" в бесконечном цикле ожидания события от другого устройства, которое "залипло" из-за этой помехи.
     
  5. ИгорьК

    ИгорьК Гуру

    while (!radio.available()) {} - так разве здесь NRF что-то вешает?
     
  6. бесконечный цикл ожидания отклика от NRF это radio.read в лупе. попробуйте отключить питание у NRF и все

    //---------------------------------------------------------------------------------------------
    //Функция отправки команды передатчику
    //---------------------------------------------------------------------------------------------
    void send_answer(unsigned long svalue,uint64_t spipe)
    {

    radio.stopListening(); //Перестаем слушать
    radio.openWritingPipe(spipe); //Открывем трубу для отправки
    radio.flush_tx();
    uint32_t len = radio.getDynamicPayloadSize();
    radio.write(&svalue,len); // Отправляем ответ
    radio.startListening();
    }

    Вот цикл

    if (radio.available())
    {
    radio.read(&MessageNRF,sizeof(MessageNRF));
    commandValue=String(MessageNRF);
    }

    Если отключаешь питание висит вся программа. Попробуйте взять либой пример из библиотеки RF.24 и вырубить питание у NRF. Любой пример висит
     
  7. Код (Text):

       unsigned long wait = micros();            
        boolean timeout = false;                                
       
        while ( ! radio.available() ){                          
          if (micros() - wait > 200 ){            
              timeout = true;
              break;
          }    
        }

       }
    Думал это спасет но такая же фигня
     
  8. А так все работает и шустро передается. А вот если пропадет питание то труба. Сделали кстати ровное и отдельно питание на NRF
     

    Вложения:

    • IMG_1975.JPG
      IMG_1975.JPG
      Размер файла:
      587 КБ
      Просмотров:
      1.672
  9. geher

    geher Гуру

    Так radio.available() не может быть больше нуля, пока радио отключено. А пока оно так, цикл вертится.
     
  10. ИгорьК

    ИгорьК Гуру

    Да я имел в виду - при чем здесь железка.
     
  11. ИгорьК

    ИгорьК Гуру

    А питание зачем отрубать, и как это делать? Ничего не понимаю.
     
  12. geher

    geher Гуру

    Странно оно как-то.
    Случайно неоднократно выдирал "на ходу" nrf (и целиком, и только провод питания, и любой другой провод). Ничего не вешалось. Естественно, ничего с него не приходило, но остальная часть кода работала без проблем.
    Для нормального вырубания питания использовал штатный способ из библиотеки rf24
    radio.powerDown();
    Тогда оно включается при первой попытке передачи.
    Еще там есть функция для "пробуждения" radio.powerUp;

    А из-за чего, кстати, принято решение о "повешении" платы? Вообще перестает выдавать диагностическую выдачу сразу после вырубания питания? Или перестают работать другие участки кода?
     
  13. Зачем обрубать питание ??? Это имитация "НЕТ СВЯЗИ". Если нет связи, то остально код программы должен работать, а он висит из-за NRF
     
  14. geher

    geher Гуру

    Кстати о коде.

    radio.read(&MessageNRF,sizeof(MessageNRF));
    commandValue=String(MessageNRF);

    Пригляделся и увидел "теоретически нехорошее".
    MessageNRF - это, насколько я понимаю, буфер.
    String(MessageNRF) на неопределенном содержимом буфера (например, питание "оторвали" в момент приема) может привести к непредсказуемым последствиям, поскольку оно может до "посинения" искать терминатор в буфере, чтобы закончить преобразование в String. "Посинение" в частности может наступить от исчерпания свободного пространства в ОЗУ, сопровождающегося разными спецэффектами вроде наползания хипа на стек.
     
  15. Да согласен, надо сделать проверку MessageNRF на underfinded
     
  16. ИгорьК

    ИгорьК Гуру

    "Ну вы, блин, даете!" Это не имитация "нет связи". Отрубите то, что должно передавать - будет вам имитация. А это просто отрубание питания.
    Терминатор в буфере оно искать не будет, ИМХО. В буфере находится, или не находится нечто, с длинной sizeof(MessageNRF), и нет там никакого терминатора не при удачной передаче, ни при неудачной.
     
  17. Ребята, только что попробовали положили сотовый телефон на приемник, обрубили связь. Ардуиша висит (остальной код программы). Проблема мне кажется в stop.listening или start.listening. В отсылке получается тоже делать if radio.available
     
  18. незя ему питание дергать, он все настройки тогда забывает.

    у него есть режим Standby, в котором он нечего не потребляет, но есть доступ к регистрам, вот в этот режим его и надо загонять
     
  19. geher

    geher Гуру

    String(MessageNRF);
    В реализации присутствует
    if (cstr) copy(cstr, strlen(cstr));
    Как-то мне всегда казалось, что strlen и присутствующий внутри copy strcpy(buffer, cstr); работают до нуля, завершающего строку.
     
  20. geher

    geher Гуру

    А если расставить по всему коду "собак" (в смысле отладочный вывод в Serial) и смотреть выдачу?
    Тогда будет ясно, где именно оно застряло. И, может быть, станет заодно ясно, почему.