OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4127|回复: 12

关于NRF一次发送多个数组!!

[复制链接]

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-4-22
在线时间
17 小时
发表于 2018-5-2 20:25:47 | 显示全部楼层 |阅读模式
近日要用nrf发送64个动态的浮点型温度值,把浮点型转换成字符型发过去的话,一共有8个数组要发,
现在主要的问题是,传输距离近的话到没有问题,远一点的话,数据会不一样,这应该是我代码的问
题,不知道要怎么写,才能一次性发这8个数组。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-4 08:26:32 | 显示全部楼层
原来是32byte发送8次
下面简单点思路做:发送10次,第一次,发送前7个float(28byte)+第一帧ID(4byte),共32byte
                                         第二次,发送接下来7个float(28byte)+第二帧ID(4byte),共32byte
                                         第三次  第四次  第五次 第六次  第七次 第八次  第九次(第九次发完已经发送63个float)
                                         第十次,发送第64个float(4byte),补零(24byte),第十帧ID(4byte)
接受端收到后判断帧ID再存入数组对应的位置,你就知道那个float是第几个了,说的好绕,你好好想想啊
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 1 反对 0

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-3 08:18:30 | 显示全部楼层
工程传上来看看
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-4-22
在线时间
17 小时
 楼主| 发表于 2018-5-3 11:03:02 | 显示全部楼层

[mw_shl_code=c,true]while(1)
        {
                //将温度值存放到共用体
                for(n=0;n<64;n++)
                {
                        temp[n].f = pixels[m];        //将64个温度值存放到共用体数组
                        m++;
                        if(m==64)m=0;
                }

                //数据转换
                for(j=0;j<29;j=j+4)
                {
                        tmp_1buf[j]          =         temp[k].i[0];
                        tmp_1buf[j+1]  =         temp[k].i[1];
                        tmp_1buf[j+2]  =         temp[k].i[2];
                        tmp_1buf[j+3]  =         temp[k].i[3];
                        k++;
                        if(k==64)k=0;
                }
               
                //发数据
                if(NRF24L01_TxPacket(tmp_1buf)==TX_OK)
                {
                        GPIO_WriteOutBits(HT_GPIOC,GPIO_PIN_9,RESET);        //熄灭LED1       
                }
               
                        delay_ms(100);[/mw_shl_code]
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-4-22
在线时间
17 小时
 楼主| 发表于 2018-5-3 11:03:36 | 显示全部楼层

[mw_shl_code=c,true]                        if(NRF24L01_RxPacket(tmp_1buf)==0)//一旦接收到信息,则显示出来.
                        {

                                        //数据转换
                                        for(j=0;j<29;j=j+4)
                                        {
                                                temp[k].i[0] =        tmp_1buf[j] ;
                                                temp[k].i[1] =        tmp_1buf[j+1];
                                                temp[k].i[2] =        tmp_1buf[j+2];
                                                temp[k].i[3] =        tmp_1buf[j+3] ;
                                                k++;
                                                if(k==64)k=0;
                                        }
                                        flag++;
                                       
                                        if(flag==8)
                                        {       
                                                for(n=0;n<64;n++)
                                                {
                                                        pixels[m] = temp[n].f;        //将值存放到温度数组里
                                                        m++;
                                                        if(m==64)m=0;
                                                }
                                                printf("%f\n",pixels[62]);        //串口打印
                                                flag=0;
                                        }        [/mw_shl_code]
回复 支持 反对

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-3 11:40:37 | 显示全部楼层
本帖最后由 szczyb1314 于 2018-5-3 13:29 编辑

研究下24L01数据手册,24L01是不是可以发送多于32byte的数据,如果可以,改下24L01的配置即可,如果不行,
   while(1)
    {
        //将温度值存放到共用体
        for(n=0;n<64;n++)
        {
            temp[n].f = pixels[m];  //将64个温度值存放到共用体数组
            m++;
            if(m==64)m=0;
        }

        //数据转换64个float全部转入tmp_1buf[256]
        for(j=0;j<255;j=j+4)
        {
            tmp_1buf[j]   =  temp[k].i[0];
            tmp_1buf[j+1]  =     temp[k].i[1];
            tmp_1buf[j+2]  =     temp[k].i[2];
            tmp_1buf[j+3]  =     temp[k].i[3];
            k++;
            if(k==64)k=0;
        }
         
        //发数据
        k=0;
        while(k<255)
        {
            if(NRF24L01_TxPacket(&tmp_1buf[k])==TX_OK) //发送成功则发送下一帧
                k = k + 32;   
            else  //发送失败需要重发
                k = k;
        }
        if(k==256)
        {
            GPIO_WriteOutBits(HT_GPIOC,GPIO_PIN_9,RESET);   //全部发送完成熄灭LED1   
        }
          k = 0;  
            
            delay_ms(100);
    }
随便写了写,大概就是这么个意思了,你自己好好组织下,注意逻辑
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-4-22
在线时间
17 小时
 楼主| 发表于 2018-5-3 12:43:22 | 显示全部楼层
szczyb1314 发表于 2018-5-3 11:40
研究下24L01数据手册,24L01是不是可以发送多于32byte的数据,如果可以,改下24L01的配置即可,如果不行,
...

好的,24L01只能发32byte,等今天下课了好好捋捋,试一试,谢谢解答
回复 支持 反对

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-3 13:43:57 | 显示全部楼层
興趣使然 发表于 2018-5-3 12:43
好的,24L01只能发32byte,等今天下课了好好捋捋,试一试,谢谢解答

程序中的变量j和k不要定义u8,用u16或者u32
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-4-22
在线时间
17 小时
 楼主| 发表于 2018-5-3 18:58:43 | 显示全部楼层
szczyb1314 发表于 2018-5-3 13:43
程序中的变量j和k不要定义u8,用u16或者u32

值好像溢出了 - -, 256的数组是u8的,这有问题吗
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-4-22
在线时间
17 小时
 楼主| 发表于 2018-5-3 19:19:44 | 显示全部楼层
szczyb1314 发表于 2018-5-3 13:43
程序中的变量j和k不要定义u8,用u16或者u32

哈哈,刚刚犯浑了,是for循环那里的J,后面是J=j+4,所以要写j<253,另外还得在发送端加延时,不然发的太快了,接收那里就乱了,感觉自己对这个模块更加了解了点,嘿嘿,谢谢老铁了
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-4-22
在线时间
17 小时
 楼主| 发表于 2018-5-3 19:43:14 | 显示全部楼层
szczyb1314 发表于 2018-5-3 13:43
程序中的变量j和k不要定义u8,用u16或者u32

不对呐 ,老哥,我把发送端,放远一点的话,  数据还是会错,,但是错的很有规律,假如我接收端想读取pixels[62]的值,放远了以后 实际接收到的,是那一列的值,就是pixels[6],pixels[14],pixels[22],pixels[30],pixels[38],pixels[46],pixels[54], pixels[62], 这几个值循环,这是啥问题呢
回复 支持 反对

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-4 08:01:28 | 显示全部楼层
本帖最后由 szczyb1314 于 2018-5-4 08:08 编辑
興趣使然 发表于 2018-5-3 19:43
不对呐 ,老哥,我把发送端,放远一点的话,  数据还是会错,,但是错的很有规律,假如我接收端想读取pix ...

从发送端来看就应该是这样子的啊,每次发送32byte其实是发送8个float,发送端发送时没有带上帧ID,所以接受端收到数据后不知道是那8个float来了,你的接受端的程序逻辑可能不对,建议你发送的时候32byte中带上这一帧的ID,接收端接受到这一帧后先判断帧ID,就知道是哪32byte来了
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-4-22
在线时间
17 小时
 楼主| 发表于 2018-5-5 11:01:10 | 显示全部楼层
szczyb1314 发表于 2018-5-4 08:26
原来是32byte发送8次
下面简单点思路做:发送10次,第一次,发送前7个float(28byte)+第一帧ID(4byte) ...

好的,谢谢老哥了,先把这方法记下了,过几天再试,我先紧急处理了下,把精度降了降,浮点型取整了,这样就少发了好几组,不容易错了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 05:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表