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 или в том, как я разделяю сообщение?

, 👍-1


1 ответ


Лучший ответ:

2
t[len + 1] = '\0';

Ваш массив объявлен как имеющий len + 1 байт памяти. Таким образом, последний индекс - это len, а не len+1. Вы записываете нулевую единицу после конца массива, таким образом, вы не передаете ее (и вместо этого отправляете один байт "мусора").

,