RF24 - Разделение и отправка полезной нагрузки длиной более 32 байт
Чтобы отправить длинную полезную нагрузку, я создал следующую функцию:
void splitMSG(const char *msg, const int arraySize, const int len)
{
Serial.print("Array size: ");
Serial.println(arraySize);
byte numPackets = (int)(arraySize / len);
byte P_iterator = 0;
if (arraySize % len > 0)
{
numPackets++;
}
Serial.print("num_Packets: ");
Serial.println(numPackets);
while (P_iterator < numPackets)
{
char t[len + 1];
char *ptr1 = msg + P_iterator * (len);
strncpy(t, ptr1, len);
t[len + 1] = '\0';
Serial.println(t);
radio.write(&t, sizeof(t));
P_iterator++;
}
}
Разделенное сообщение отправляется на последовательный монитор, чтобы убедиться, что оно соответствует ожиданиям.
** На передающем устройстве:
void loop()
{
radio.stopListening();
char send_msg[] = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // <----- input msg
splitMSG(send_msg, sizeof(send_msg), 10); // <----- split to 10 bytes a packet
delay(1000);
// Serial.println("±±±±±±±±");
}
На последовательном мониторе я получаю:
08:06:17.569 -> Array size: 37
08:06:17.569 -> num_Packets: 4
08:06:17.569 -> 1234567890
08:06:17.569 -> ABCDEFGHIJ
08:06:17.569 -> KLMNOPQRST
08:06:17.569 -> UVWXYZ
**На принимающем устройстве:
void loop()
{
if (radio.available())
{
while (radio.available())
{
char buf[32];
radio.read(&buf, sizeof(buf));
Serial.print("got msg: ");
Serial.println(buf);
radio.flush_rx();
}
}
delay(100);
}
На последовательном мониторе я получаю:
08:08:18.462 -> got msg: 1234567890⸮⸮⸮⸮
08:08:18.561 -> got msg: ABCDEFGHIJKLMNOPQRSTUVWXYZ
08:08:19.555 -> got msg: 1234567890ABCDEFGHIJKLMNOPQRST⸮⸮⸮⸮
08:08:20.549 -> got msg: 1234567890ABCDEFGHIJKLMNOPQRST⸮⸮⸮⸮
08:08:21.576 -> got msg: 1234567890ABCDEFGHIJKLMNOPQRST⸮⸮⸮⸮
08:08:22.570 -> got msg: 1234567890ABCDEFGHIJKLMNOPQRST⸮⸮⸮⸮
08:08:22.669 -> got msg: UVWXYZ
Проблема с буфером radio.write
или в том, как я разделяю сообщение?
@Guy . D, 👍-1
1 ответ
Лучший ответ:
▲ 2
t[len + 1] = '\0';
Ваш массив объявлен как имеющий len + 1
байт памяти. Таким образом, последний индекс - это len
, а не len+1
. Вы записываете нулевую единицу после конца массива, таким образом, вы не передаете ее (и вместо этого отправляете один байт "мусора").
,
@Mat
Смотрите также:
- вопрос по трубке nRF24L01
- Возможно ли иметь массив массивов int?
- Замена нескольких выводов pinMode() и digitalWrite() на массив
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Инициализация массива структур
- Невозможно создать массив типа const char*
- Работает ли конструкция int array[100] = {0} на Arduino?
- Как подключить NodeMCU к NRF24L01