51和stm32之间通过nrf24l01通信的一些总结

stm32的代码复杂些,而且某宝卖家给的代码写得有点乱而且注释有问题啊。。

吐槽完毕,还是要脑子清醒思路清晰才能高效完成工作发现问题分析问题解决问题

总结下睡觉。

1.地址、接收通道、通信频道什么的,反正收发模式设置要相同

2.数据宽度、地址宽度

3.关键一点:数值和字符!

      ASCII码表在线查询(1.0 beta 1)

  由于stm32上的与24l01有关的代码现在还是用的某宝卖家的,还没完全吃透。就这么说吧,其中的函数的参数是数字(不知道是不是这样表达的即表里的代码,另外c语言的变量不允许数字开头),而我发送的数据是字符串,发现问题花了一会儿,想办法解决又花了好一会儿。两边代码都不好改,参数如果是数组(指针)那真是传来传去如果要改都不知道改哪了,stm32的代码更是,想想其他的解决办法吧。

一个解决方法:step1.数值,字符嘛,查ascⅡ码表呗

       step2.见下面的4,用 if ,只把数组的第一个元素拿出来,转换成数字或者把数字变回去。

 

4.再来一个关键一点24l01发数据的时候不知道为什么,在把数据宽度设定为8字节后,接收方还是收到32字节的数据,而且前8位后那些会混杂好多数据。当传输数据为字符串数组时,如果只有一组数据,那后面的会混杂乱码,只要传输过程不丢帧什么的,每一次的乱码都一样;如果有多组数组,则会包含这一数组和下一数组的数据,也是每一次都一样。这是用串口看到的,即收到数据后存入rx_buf[],然后通过串口在电脑上显示。显示的应该就是收到的数据。

一个解决方法是用 if 来个判断,

if(!strcmp(RX_Buffer,"Forward "))

            {

                ES = 0;            

                for(i=0;i<8;i++)

                {

                    SBUF = RX_Buffer[i];

                    RX_Buffer[i]=0;

                    while(!TI);

                    TI = 0;

                }

                ES = 1;

            }

 

因为前面8字节在不丢帧的情况下是正确的,那就在 if 里面用 strcmp 比较一下,如果和预期的相同再进行下一步处理。这样就能控制在串口助手上显示8字节的数据,也就可以作为舍弃多余数据的条件。

另外当把数据宽度调整到32字节时,串口助手就能一次收到252字节的数据(可能是丢包了,看着应该像256=32*8 字节)。

这个问题先撂下了,如果有朋友知道请多指教:)

 

 

就到这吧,感觉有点乱。。以后再整理吧,这里只做个备忘。

现在只是验证性的完成了,即51和stm32之间能通过24l01通信了(控制点亮led),还要做好多事情呢。只是这么简单的整理完又花了不下40分钟,表达能力捉急。。睡觉

 

附:

参考这里

nrf24l01发送数据的步骤:

  0.CE清0,进入待机状态

  1.写本机身份地址到TX_ADDR

  2.写0通道接收地址到RX_ADDR_P0(与TX_ADDR一样)

  3.设置自动应答允许,EN_AA

  4.设置0通道允许接收,EN_RXADDR

  5.配置自动重发次数SETUP_RETR

  6.选择通信频道RF_CH

  7.配置发射参数(如发射功率,数据传输速率)RF_SETUP

  8.设置0通道有效数据宽度RX_PW_P0(就是要传送数据包的长度)

  9.设置模块配置寄存器CONFIG到发送模式

  10.将要传送的数据写入发送缓冲寄存器TX_FIFO

  11.将CE置1,进入发送状态,CE高电平至少维持10us

 

设置接收数据的步骤:

  0.CE=0,进入待机状态

  1.写发送机身份地址到0

  2.设置自动应答允许EN_AA

  3.设置允许0通道接收数据EN_RXADDR

  4.选择通信频道RF_CH

  5.选择0通道有效数据宽度RX_PW_P0

  6.配置发射参数(发射功率、传输速率等)RF_SETUP

  7.设置模块的配置寄存器CONFIG在接收模式

  9.CE=1,进入接收状态,高电平至少维持10us

 

 

 

你可能感兴趣的:(stm32)