即时通讯工具,arduino和NRF24L01

时间:2016-01-10 02:21:00

标签: arduino wireless

我试图使用arduino,NRF24L01芯片和TMRH20的RF24库来创建即时通讯工具。 它是为2 arduino板而设计的。

这里是我的信使的问题:大部分时间,接收者都没有收到消息,有时他收到消息但是一切都混淆了,就像一个错误的编码错误... < / p>

这是代码: http://pastebin.com/TP53VyeH

尝试它你需要2个arduino板,插上2个不同的USB端口。对于其中一个电路板,您必须更改第10行的数字。

ps:在我的电台上,如果我尝试&#34; GettingStarted_HandlingData&#34;,一切正常,所以问题不在于我的arduinos ......

2 个答案:

答案 0 :(得分:2)

您将数据直接捕获到String对象中,而不是其缓冲区。

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

这很糟糕,因为String类不仅长约6个字节,而且还覆盖了将指针存储到其缓冲区的字节。因此,当您读取String时,其指针现在位于某个任意位置。您将阅读其中的任何内容,这可能是其他变量,寄存器甚至GPIO引脚。 (此时您的申请可能非常腐败。)

您需要使用字符缓冲区。

编辑:

  

似乎消息在32个字符后被删除,而不是50 ......不知道为什么。我尝试用200替换50,并且消息在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).
然而,我会发布这个问题作为另一个理由,为什么它会是一个很好的补充。

答案 1 :(得分:1)

我终于开始工作了。我在传输过程中使用了char而不是String,它解决了所有的问题。

这意味着设置了最大消息长度限制(我设置了50个字符,这已经足够了)。

这是工作代码: http://pastebin.com/5Ryjr8sD

(ps:对于串行通信,输出仍然是一个字符串,所以我使用:message.toCharArray(messagechar,50);

将其转换为char

编辑:似乎消息在32个字符后被删除,而不是50 ...不知道为什么。我尝试用200替换50,并且消息仍然在32个字符后被删除

edit2:这是最终的代码,如果他写了超过32个字符,就会阻止用户。 http://pastebin.com/TVgu16zx