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. Первый набор символов получен и напечатан правильно. Как мне это исправить? Поможет ли очистка буфера (я сомневаюсь в этом, потому что первая передача получена правильно)?

, 👍2

Обсуждение

Ваш код 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


2 ответа


1

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

В библиотеке RF24 есть еще одна функция, которая называется startWriting(). В описании в библиотеке не было ясно, в чем разница между this и write(). Но я заметил, что последний символ отсутствовал при использовании startWriting(). Поэтому я просто изменился

radio.read(&text, sizeof(text));

в мастере, чтобы

 radio.read(&text, sizeof(text+1));

и вуаля! Теперь код выполняет свое предназначение!!

,

0

Вы плывете на волне неопределенного поведения. sizeof возвращает размер базового типа. В вашем случае char. Что равно 1. Что вам действительно нужно, так это выделенный propper массив char text[32] = "" и требуемая длина строки с использованием strlen(text) + 1. +1, чтобы также передать нулевой терминатор строки.

Максимальная длина строки, которая может быть передана с использованием nRF24L01, составляет 32 байта. Из-за обязательного завершения строки nul вы можете отправить не более 31 символа в качестве допустимой строки.

Интересный факт: то же ограничение в 31 символ применяется к длине имени файла в классической Mac OS, по крайней мере, до 7.x, а также в Amiga DOS / Workbench.

,

Пожалуйста, проверьте новый код в вопросе. Я отредактировал, как вы и предлагали., @Kishore