Всем привет, не выходит реализовать двусторонние общение на NRF24. Есть NANO+NRF24 и NANO+RC522+NRF24. Суть такая что считываю ардуинкой (1) UID метки, передаю на другую ардуинку(2), после этого должен получить любое сообщение от ардуинки (2) на (1). Ну в идеале это текст который привязан к номеру меки. Работает все кроме отправки либо приема обратного сообщения. Использую библиотеку RF24Network потому что в идеале должно быть 12 ардуино с RC522 и они отправляют это на главную. Код NANO+RC522+NRF24 Код (C++): #include <RF24Network.h> #include <RF24.h> #include <SPI.h> #include <MFRC522.h> #define SS_RFID 10 #define RST_RFID 9 MFRC522 rfid(SS_RFID, RST_RFID); // Пины RC522 MFRC522::MIFARE_Key key; #define SS_NRF 8 #define RST_NRF 7 RF24 radio(RST_NRF, SS_NRF); // Пины NRF24 int count = 0 ; byte UID[4]; //Храним UID тут RF24Network network(radio); const uint16_t this_node = 2;// Адресс этой ардуинки const uint16_t other_node = 1;// Адресс куда передаем String output; // Строкапередача UID + кредиты (не используется) void setup(void) { Serial.begin(9600); SPI.begin(); radio.begin(); network.begin(/*канал*/ 90, /*адрес ардуины*/ this_node); // Задаем канал и адрес ардуины rfid.PCD_Init(); // Инициализация RC522 for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } Serial.print("READY TX"); } void printDec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], DEC); } } void card () { // тут считываем новую карту и сохраняем в массив UID if ( ! rfid.PICC_IsNewCardPresent()) return; if ( ! rfid.PICC_ReadCardSerial()) return; if (rfid.uid.uidByte[0] != UID[0] || // Если приложенна новая карта rfid.uid.uidByte[1] != UID[1] || rfid.uid.uidByte[2] != UID[2] || rfid.uid.uidByte[3] != UID[3] ) { for (byte i = 0; i < 4; i++) { UID[i] = rfid.uid.uidByte[i]; } Serial.print("In dec: "); printDec(rfid.uid.uidByte, rfid.uid.size); Serial.println(); count = 1; // Меняем значение переменной } else Serial.println("Card read previously."); // Если приложенна текущая карта rfid.PICC_HaltA(); rfid.PCD_StopCrypto1(); } void received () { // Прием обратных данных while (network.available()) // Если есть сообщение то читаем его ! { //НО оно зависает на этом, если убрать while тогда оно хоть работает дальше. RF24NetworkHeader header; static char mecountage[32]; // сюда пишем принятое сообщение network.read(header, &mecountage, sizeof(mecountage));// Читаем сообщение Serial.print("Received: "); Serial.println(mecountage); // Выводим принятое сообщение count = 0; } } void sen () { // Тут отправляем UID Serial.print("Sending..."); RF24NetworkHeader header(/*to node*/ other_node); //output = (String (mecountage[0]) + String (mecountage[1]) + String (mecountage[2]) + String (mecountage[3])); // Не используется bool ok = network.write(header, &UID, sizeof(UID)); // Отправляем if (ok) { Serial.println("ok."); count = 2 ; // Меняем переменную } else { Serial.println("failed"); } } void loop(void) { digitalWrite (SS_RFID, LOW); // Меняем состояние count пинов digitalWrite (SS_NRF, HIGH); network.update(); if (count == 0) { // Читаем карту card(); } if (count == 1) {// Отправляем UID digitalWrite (SS_RFID, HIGH); // Меняем состояние count пинов digitalWrite (SS_NRF, LOW); sen (); } if (count == 2) { // Принимаем сообщение received (); } } Код NANO+NRF24 Код (C++): #include <RF24Network.h> #include <RF24.h> #include <SPI.h> #define SS_NRF 8 #define RST_NRF 7 RF24 radio(RST_NRF, SS_NRF); // Пины NRF24 String serial; // Для вывода в сериал порт принятого UID String UID; RF24Network network(radio); int count = 0; const uint16_t this_node = 1;// Адресс этой ардуинки const uint16_t other_node = 2;// Адресс куда передаем String card1 = "2342434246"; // Тут храню UID карт который использую String card2 = "192247132166"; String card3 = "96197102168"; String card4 = "55170114180"; const char* info; void setup(void) { Serial.begin(9600); SPI.begin(); radio.begin(); network.begin(/*канал*/ 90, /*адрес ардуины*/ this_node); // Задаем канал и адрес ардуины Serial.println("READY RX"); } void received () { // Прием UID if (count == 0) { while ( network.available() ) { RF24NetworkHeader header; byte message[4]; // храним юид network.read(header, &message, sizeof(message)); Serial.print("Received: "); UID = (String (message[0]) + String (message[1]) + String (message[2]) + String (message[3])); // Даже не спрашивайте зачем ) UID для сравнения serial = (String (message[0]) + String (message[1]) + String (message[2]) + String (message[3]) + " From:" + header.from_node); Serial.println(serial);// выводим UID и от какой ардуины получен count = 1; } } } void sen () { // Обратная передача данных if (count == 1) { if (UID = card1) { // если пришел UID 1 карты то message = cadr1 info = "card1"; } if (UID = card2) { // если пришел UID 1 карты то message = cadr1 info = "card2"; } if (UID = card3) { // если пришел UID 1 карты то message = cadr1 info = "card3"; } if (UID = card4) { // если пришел UID 1 карты то message = cadr1 info = "card4"; } Serial.print("Sending..."); RF24NetworkHeader header(/*to node*/ 2); bool ok = network.write(header, info, sizeof(info)); // отправляем информацию о карте if (ok) { Serial.println("ok."); count = 0; } else { Serial.println("failed"); } } } void loop(void) { network.update(); received(); sen(); } Подскажите как правильно реализовать обратную передачу.
Чтобы проверить, воспользуйтесь отладкой. На пк отправляйте сообщения, которые скажут вам, на каком этапе ваша программа ошибается.
Я в курсе на каком этапе она зависает, она крашится на этапе отправки обратного сообщения, если я эту часть кода убираю то все работает идеально. Просто не очень понимаю как синхронизировать прием и отправку что ли
Сделай автоподтврждение и в автответе отправляй данные. Вообще, завязывай с библами - в них через одно место все.
Я уже думал насчет авто подтверждения, но тогда у меня другой вопрос появился. Прилетает UID на ардуинку с неё идет в сериал на ПК, он капается в своей базе, отправляет инфу в сериал, ардуинка считывает и отправляет автоподтверждение. Мне кажется что не успею все обработать.
Автоподтверждение срабатывает сразу же после получения пакета. Т.е. данные там уже должны лежать. А вообще, читай даташите прежде, чем с чем-то работать.
Ну так вот я и говорю же не смогу отправлять с авто подтверждением. Всё же до сих пор не могу сделать нормальный обратный ответ на присланный UID.