ARDUINO Не выходит сделать одновременно Request и Response

Stikulzon

✩✩✩✩✩✩✩
29 Сен 2018
8
0
Попытался реализавать на основе кода Алекса из гайда по радио модулю и приём и отправку сигнала.
Отправляет без проблем, а вот принимать перестаёт после первого вызова radio.stopListening(); в loop, хотя перед каждым чтением стоит radio.startListening();.
В целях стоит создать request-response сервер, но на стадии теста возникла вот такая проблема. Может кто знает как её решить?
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Зачем так сложно - каждый раз заново открывать приемную и передающую трубу, менять каналы и тд и тп...
Трубы для чтения и передачи открываете один раз - в сетапе. Канал тоже менять не нужно. Все, что нужно сделать для переключения между приемом и передачей - дать команду radio.stopListening() или startListening()
У меня в такой связке отлично все работает
 
  • Лойс +1
Реакции: PiratFox

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
TX:
void Request(){

  radio.openReadingPipe(1,address[1]);      //хотим слушать трубу 1
  radio.setChannel(0x50);  //выбираем канал (в котором нет шумов!)

  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
  delay(10)   //!!! здесь нужна задержка, чтобы успел включиться приёмник.!!!

  uint16_t gotByte;     
  while(radio.available() == false) delay(5);           // слушаем эфир, пока не приняты данные
  radio.read( &gotByte, sizeof(gotByte) );         // читаем данные из буфера приёмника в переменную

  Serial.print("Recieved: "); Serial.println(gotByte);

  radio.stopListening();
  }
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,058
910
@PiratFox, цикл While в строке 10 - это логическая ошибка. Если приемник почему-то ничего не шлет - программа зависнет в этой строке навсегда и даже не сможит сообщить хозяину, в чем проблема
Не нужен тут while ни в коем случае. Достаточно проверить
C++:
if ( radio.available(&pipeNo)){
один раз.
А цикличность в программе обеспечивает цикл loop()
 
  • Лойс +1
Реакции: Nikanor и PiratFox

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Сорри, посмотрел исходный код - @PiratFox, мое замечание относится не в вам, а коду @Stikulzon,

Думаю, что его проблема с зависанием кода после первого приема обьясняется как раз этим while - тут же нет выхода, попав в это место, программа зависнет в нем насегда
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
Думаю, что его проблема с зависанием кода после первого приема обьясняется как раз этим while - тут же нет выхода, попав в это место, программа зависнет в нем насегда
А может, выход происходит как раз тогда, когда приняты данные? И не происходит
radio.read( &gotByte, sizeof(gotByte) );
т.к. данные приняты в приёмник, но не считаны в переменную, ведь из while выбросит раньше, чем это произойдёт. Хотя, я могу чего-то путать, сегодня башка запаренная у мну... :( Тогда, возможно, правильно будет:

while( radio.available() == false ) delay(5); // слушаем эфир со всех труб
radio.read( &gotByte, sizeof(gotByte) ); // чиатем входящий сигнал
Serial.print("Recieved: "); Serial.println(gotByte);
radio.stopListening();

Повторюсь, могу ошибаться с функцией radio.available()...
P.S. Соответственно подправил выше код функции Request(). И да, Ваш вариант тоже вполне имеет место быть.
 
Изменено: