nRF24 - порядок включения приёмника и передатчика ?

Mux
Offline
Зарегистрирован: 12.02.2014

Доброго.

Экспериментирую с парой nRF24L01+, один модуль в режиме приёмника, другой в режиме передатчика.

Обнаружил странный фокус - чтобы всё работало "приёмник" должен быть включен первым, а затем "передатчик". Если запускать "приёмник" при работающем передатчике - СВЯЗИ НЕТ!

  Код для примера взят отсюда (в самом низу страницы) http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo (типа джойстик)

  Пробовал явно указывать setChannel в обоих устройствах - повдение не меняется.

  Может как-то хитро нужно инициализировать устройства, чтоб они были безразличны к порядку включения.

MaksMS
Offline
Зарегистрирован: 11.03.2013

А если выключить потверждение через  radio.setAutoAck(false);  ?

Mux
Offline
Зарегистрирован: 12.02.2014

С отключеным на стороне передатчика setAutoAck(false); связи вообще нет.

Да ещё. Если связь есть (сначала включаем приёмник, зетем передатчик) reset приёмника приводит к потере связи а  reset передатчика не приводит.

Модули менял местами для проверки физической исправности - всё так же.

upd: сейчас сообразил, что Ack нужно, наверное, на приёмнике тоже вырубать - он-же подтверждение о приёме шлёт.

Mux
Offline
Зарегистрирован: 12.02.2014

отключил Ack на обеих сторонах - работает так-же. При сбросе приёмника связь пропадает.

MaksMS
Offline
Зарегистрирован: 11.03.2013

Не понятна логика конечно.. А если radio.startListening();  поставить в loop на приемнике ?

 

Mux
Offline
Зарегистрирован: 12.02.2014

Прошу прощения - ввёл в заблуждение - мой код приёмника чуть отличается от того, что в примере.

мой код (не рабоочий):

if ( radio.available() )
  {
    bool done = false;
    done = radio.read( &joy_state, sizeof(joy_state) );
    if ( done ) {
      printf("js:%i\n\r",joy_state);
    }
}

рабочий код:

if ( radio.available() )
  {
    bool done = false;
    while (!done) {
      done = radio.read( &joy_state, sizeof(joy_state) );
      printf("js:%i\n\r",joy_state);
    }
}

upd2:

Так всё работает.

Дурацкий вопрос, но всё-же, почему мой код не работал? Я так понимаю, в цикле while(!done) зачитывается всё содержимое приёмного буфера. Что мешало "дочитать" его в моём коде на следующей итерации loop();

 

Mux
Offline
Зарегистрирован: 12.02.2014

Уже догадался, вот это:

bool done = false;

Называется "сам дурак".

Mux
Offline
Зарегистрирован: 12.02.2014

Кстати, рабочий код видимо тоже не очень правильный, на больших структурах цикл может крутиться несколько раз в течении которых содержимое буфера не совсем корректно.

Правильней наверное так:

if ( radio.available() )
  {
    bool done = false;
    while (!done) {
      done = radio.read( &joy_state, sizeof(joy_state) );
      }
     printf("js:%i\n\r",joy_state);
}