nRF24L01 - пропускает конечные символы во время передачи
Это кодекс моего Хозяина.
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
RF24 radio(7, 8);
const byte address[6] = "00001";
char text[20] = "";
int flag;
char *p;
int i;
void print();
void read();
void rfwrite();
void setup() {
Serial.begin(9600);
radio.begin();
radio.setDataRate(RF24_1MBPS);
radio.setChannel(1);
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
flag = 0;
p = text;
}
void loop() {
if (Serial.available()) {
read();
}
if (flag) {
print();
rfwrite();
}
}
void print() {
Serial.println(text);
flag = 0;
}
void read() {
p = &text[0];
for (i = 0; Serial.available(); p++, i++) {
*p = Serial.read();
}
text[i + 1] = '\0';
flag = 1;
}
void rfwrite() {
radio.startWrite(text, strlen(text)+1);
}
Ведомый код:
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
RF24 radio(7, 8); //ce, csn
const byte address[6] = "00001";
char text[20] = "";
int i;
void write_to_array();
void print();
void setup() {
Serial.begin(9600);
radio.begin();
radio.setDataRate(RF24_1MBPS);
radio.setChannel(1);
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
while (radio.available()) {
write_to_array();
print();
}
}
void write_to_array() {
radio.read(text, strlen(text)+1);
}
void print() {
Serial.println(text);
}
Я отредактировал код и создал его с помощью массива, как сказал @Kwasmich. Но теперь некоторые конечные символы не печатаются. Когда я набираю 1234567890-=
в передатчик, печатается только 1234567890-
. Когда я ввожу новый набор символов после этого, печатается отсутствующий =
. Кроме того, это происходит только при второй передаче после того, как я загружаю код в Arduino. Первый набор символов получен и напечатан правильно. Как мне это исправить? Поможет ли очистка буфера (я сомневаюсь в этом, потому что первая передача получена правильно)?
@Kishore, 👍2
Обсуждение2 ответа
Это не правильное решение, объясняющее, почему проблема возникла в первую очередь, а просто обходной путь для любого, кто сталкивается с той же проблемой.
В библиотеке RF24 есть еще одна функция, которая называется startWriting(). В описании в библиотеке не было ясно, в чем разница между this и write(). Но я заметил, что последний символ отсутствовал при использовании startWriting(). Поэтому я просто изменился
radio.read(&text, sizeof(text));
в мастере, чтобы
radio.read(&text, sizeof(text+1));
и вуаля! Теперь код выполняет свое предназначение!!
Вы плывете на волне неопределенного поведения. sizeof возвращает размер базового типа. В вашем случае char. Что равно 1. Что вам действительно нужно, так это выделенный propper массив char text[32] = ""
и требуемая длина строки с использованием strlen(text) + 1
. +1, чтобы также передать нулевой терминатор строки.
Максимальная длина строки, которая может быть передана с использованием nRF24L01, составляет 32 байта. Из-за обязательного завершения строки nul вы можете отправить не более 31 символа в качестве допустимой строки.
Интересный факт: то же ограничение в 31 символ применяется к длине имени файла в классической Mac OS, по крайней мере, до 7.x, а также в Amiga DOS / Workbench.
Пожалуйста, проверьте новый код в вопросе. Я отредактировал, как вы и предлагали., @Kishore
- nRF24L01+ Невозможно установить адрес
- Как автоматически сбросить nrf24l01+ с кодом?
- Как отправить данные датчика с Arduino через NRF24L01 на Raspberry Pi
- nRF24L01 + потеря пакетов, вызванная считыванием Arduino и связью с датчиками
- Сообщение передается несколько раз от одного arduino к другому с помощью nRF24L01
- Не удается подключить мой ESP-12F к Wi-Fi с моим Arduino Uno
- NRF24L01 PA+LNA с Arduino
- Serial.parseInt() занимает больше времени, чем хотелось бы
Ваш код
char text = ""
может содержать только один символ, а не строку. Вам нужен либо массив символов, либо указатель на символ. Аналогично,sizeof(text)
равен 1, потому что это всегда один символ., @Christian Lindig@ChristianLindig, но это не причина отсутствия персонажа, @Juraj
В настоящее время ваш код отправляет сообщение только по одному символу за раз. Не уверен, где появляется недостающий символ, но я почти уверен (по опыту), что когда вы исправляете проблему с одним символом, проблема с отсутствующими символами также исчезает., @Gerben
Я не могу протестировать это прямо сейчас, но я предполагаю, что проблема в вашем подчиненном коде, инициализации text = "" . Поэтому sizeof(text) при первоначальном запуске равен 0, поэтому что-то в radio.read(&text, sizeof(text)) пойдет не так. Не могли бы вы проверить с помощью различной инициализации текста, например, "0"?, @RJPlog
@RJPlog Я попробовал то, что вы предложили, инициализировав текст как "a". Результат остался прежним, хотя я думаю, что иногда я замечал, что первая передача после загрузки кода в arduino привела к успешному получению всех символов, я не могу сказать наверняка., @Kishore