您将数据直接抓取到 String 对象中,而不是其缓冲区。
radio.read( &message, sizeof(message) );
这很糟糕,因为 String 类不仅大约 6 个字节长,而且您已经覆盖了存储指向其缓冲区的指针的字节。因此,当您读取字符串时,它的指针现在位于某个任意位置。您将阅读那里的任何内容,这可能是其他变量、寄存器,甚至是 GPIO 引脚。 (此时您的应用程序可能非常损坏)。
您需要使用字符缓冲区。
编辑:
似乎消息在 32 个字符后被删除,而不是 50 个字符......不知道为什么。我尝试将 50 替换为 200,但消息在 32 个字符后仍然被截断。
您应该使用radio.getPayloadSize() 来确保您的数据可以接收到尽可能大的数据包。此外,如果您需要发送大量数据,或者想要发送较小的数据包,您可以使用radio.setPayloadSize()。但是,最多有 32 个字节。
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).
不过,我会将这个问题作为另一个很好的补充的原因。