Вы захватываете данные непосредственно в объект String, а не в его буфер.
radio.read(&message, sizeof(message));
Это плохо, так как не только класс Строка длиной около 6 байт, вы перезаписаны байты, которые хранят указатель на свой буфер. Поэтому, когда вы читаете String, его указатель теперь находится в каком-то произвольном месте. Вы будете читать все, что есть, и это могут быть другие переменные, регистры и даже контакты GPIO. (на данный момент ваше приложение может быть очень поврежденным).
Вам необходимо использовать буфер символов.
EDIT:
, кажется, что сообщение режутся после 32 символа, а не 50 ... Не знаю, почему. Я попытался заменить 50 на 200, и сообщение по-прежнему сокращается после 32 символов.
Вы должны использовать radio.getPayloadSize()
, чтобы обеспечить доставку ваших данных самым большим пакетом. Кроме того, если вам нужно отправить большие объемы данных или хотите отправить более мелкие пакеты, вы можете использовать radio.setPayloadSize()
. Тем не менее, существует максимум байт.
radio.startListening();
char buffer[ radio.getPayloadSize() ]; //Note: an array like this is a GCC extension, not standard C++
if(radio.available()) {
radio.read(&buffer, radio.getPayloadSize());
}
message = buffer; //Not really needed, you can just use the buffer.
Использование цикла не кажется правильным, то radio.available()
, если весь пакет получен. Цикл здесь будет только отбрасывать все, кроме последнего пакета. Вы должны, может быть петля все получить сторону (после radio.startListening();
), так что вы можете распечатать/процесс каждый пакет, как они приходят в.
Вы не можете использовать объект String, поскольку он не распознает новые данные (его длина не будет обновляться, если вы используете свой внутренний буфер напрямую). У меня есть a patch I'm trying to get merged в ядро на данный момент, что позволило бы что-то вроде этого:
message.buffer(radio.getPayloadSize());
radio.read(message.c_str(), radio.getPayloadSize());
message.validate(); //Allow String to detect new contents (Not in the core yet).
Я однако размещать этот вопрос как еще одна причина, почему это было бы хорошим дополнением.
благодарит вас за предложение, я пробовал ваше решение, но получатель получит пустое сообщение. Я, наконец, получил его, чтобы wotk работал с char вместо String. (см. мое другое сообщение). Я надеюсь, что ваш патч будет объединен;) – n0tis
@ n0tis, обновите или добавьте редактирование до конца своего сообщения. Вы, скорее всего, делаете что-то неправильно. Ваш оригинальный код, как я уже упоминал, не будет работать вообще! –
@ n0tis Массив, который я разместил, является локальным, а не статическим, вы не можете использовать sizeof на нем, если это то, что вы сделали. Вместо этого я использовал 'radio.getPayloadSize()'. –