Реализация отправки из 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);
}
В целях тестирования передаваемые сообщения поступают с другого моего устройства, которое представляет собой просто ручной передатчик. Что могло бы решить мою проблему, так это способ полностью перезагрузить радио при получении первого сообщения, чтобы трубы не мешали друг другу, а затем устройство можно было повторно инициализировать в качестве передатчика.
Удачи!
@Danijel Maraž, 👍0
Обсуждение1 ответ
Решено простым повторением
gpio_enable(SCL, GPIO_OUTPUT);
gpio_enable(CS_NRF, GPIO_OUTPUT);
// конфигурация радио
radio.begin();
radio.setChannel(channel);
radio.setAutoAck(false);
перед открытием нового канала записи.
- Esp8266 Vin контакт
- Отправка данных из ESP8266 в PHP
- ОТА-программа SPIFFS на ESP8266
- Порт Arduino OTA не обновляется в Arduino IDE
- Скетч мигания ESP8266 не мигает светодиодом
- Как программно получить ответ на выданную AT-команду для ES266 на Arduino?
- Как я могу перечислить только файлы, начинающиеся с "/LOG?"
- Как отправить пакет данных UDP между двумя точками доступа?
что такое «чип»?, @jsotola