Реализация отправки из N и получения из N с помощью FreeRtos и радиомодуля RF24.

Я пытаюсь заставить свой первый чип отправлять данные через радиоканал nrf24, а другой его слушать. После получения первых данных он должен перейти в режим передачи и сам передать новые данные. Основная цель всего этого — реализовать протокол raft с участием как минимум 3-х чипов. Таким образом, требования заключаются в том, чтобы каждый чип прослушивал все время и прекращал прослушивание через случайные промежутки времени для отправки широковещательного сообщения всем остальным чипам. По сути, связь никогда не осуществляется между двумя чипами, а всегда между одним и многими. Я встречал такие руководства, как http://forum.arduino.cc/index.php?topic=421081 но это всегда сводится к стабильному состоянию Master vs Slaves, в то время как моя ситуация более динамична. Это моя текущая задача. Слушатель работает отлично до первого полученного сообщения, когда он открывает канал записи. Затем он не пишет и не возвращается к прослушиванию.

void test_Task(void *pvParameters){

    printf("some init\n");
    bool hastoSend = false;


    radio.openReadingPipe(1, address);
    while(1){

        radio.startListening();
        if (radio.available()) {
            radio.read(&rx_data, sizeof(rx_data));

                if (rx_data[1] == 101){
                    printf("Received message: %d\n", rx_data[1]);
                    hastoSend = true;
                    printf("%d\n",rx_data[0]);
                    //int someint = *((int*)pvParameters);

                    // включаем светодиод1
                    write_byte_pcf(led1);
                    vTaskDelay(pdMS_TO_TICKS(200));
                    write_byte_pcf(0xff);
                }

        }else{
                if (hastoSend){

                    printf("I need to send a message!\n");
                    printf("sending a message\n");
                    radio.openWritingPipe(address2);
                    radio.stopListening();
                    transmit_nrf24();
                    radio.printDetails();
                    hastoSend = false;
                    radio.openReadingPipe(1, address);

                }
        }


    }

}

Это моя настройка радио:

static inline void setup_nrf() {

    uart_set_baud(0, 115200);
    gpio_enable(SCL, GPIO_OUTPUT);
    gpio_enable(CS_NRF, GPIO_OUTPUT);

    // radio configuration
    radio.begin();
    radio.setChannel(channel);
    radio.setAutoAck(false);


}

В целях тестирования передаваемые сообщения поступают с другого моего устройства, которое представляет собой просто ручной передатчик. Что могло бы решить мою проблему, так это способ полностью перезагрузить радио при получении первого сообщения, чтобы трубы не мешали друг другу, а затем устройство можно было повторно инициализировать в качестве передатчика.

Удачи!

, 👍0

Обсуждение

что такое «чип»?, @jsotola


1 ответ


2

Решено простым повторением

gpio_enable(SCL, GPIO_OUTPUT);
gpio_enable(CS_NRF, GPIO_OUTPUT);

// конфигурация радио
radio.begin();
radio.setChannel(channel);
radio.setAutoAck(false);

перед открытием нового канала записи.

,