OpenEdv-开源电子网

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

NRF24L01如何传输传感器数据

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2018-4-9
在线时间
1 小时
发表于 2018-4-9 20:34:58 | 显示全部楼层 |阅读模式
从传感器独到的数据不知道怎么传出去....用例程改他传出去都是ascall码,不是具体数据...比如我读到温度是20,怎么把温度传出去而不是传ascall码20
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10627
金钱
10627
注册时间
2017-4-14
在线时间
2778 小时
发表于 2018-4-9 22:26:35 | 显示全部楼层
收发都是你自己定义的呀接收端处理就可以了
回复 支持 反对

使用道具 举报

7

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
496
金钱
496
注册时间
2017-12-11
在线时间
63 小时
发表于 2018-4-10 09:05:08 | 显示全部楼层
将温度拆开传(T为传感器采集的温度),shi=T/10;  ge=T%10;加上一个简单的包头包尾例如0xaa,shi,ge,0xbb。这样接收端接收一个数据包后只需要定义一个变量TT,然后 TT=shi*10+ge就可以了,我还是比较喜欢用ascall码传输的。我有发表的一篇NRF24L01+的学习心得希望对你有用。
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2018-4-9
在线时间
1 小时
 楼主| 发表于 2018-4-12 20:49:38 | 显示全部楼层
轱辘t309065 发表于 2018-4-10 09:05
将温度拆开传(T为传感器采集的温度),shi=T/10;  ge=T%10;加上一个简单的包头包尾例如0xaa,shi,ge,0xb ...

用ASCALL码怎么传呀,能举个例子吗?
回复 支持 反对

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10627
金钱
10627
注册时间
2017-4-14
在线时间
2778 小时
发表于 2018-4-12 21:16:50 | 显示全部楼层
本帖最后由 275891381 于 2018-4-12 21:30 编辑
Jamry 发表于 2018-4-12 20:49
用ASCALL码怎么传呀,能举个例子吗?

你的发送buff不是32 的吗,最简单的就是弄个32长度的结构体和发送buff定义到一个共同体
typedef struct _data_struct{
u8  data1;   //占用2字节
u16 data2;   //占用2字节
u32 data3;   //占用4字节
float data4; //占用4字节
//可以继续添加,累加和小于等于32就可以了
}data_struct;

typedef union _data_union
{
   u8             tx_buff[32];
   data_struct    data_temp;
}data_union;



主函数里面
data_union  data;
data.data_temp.data1=0x0a;
data.data_temp.data2=0x123;
data.data_temp.data3=0x9876;
data.data_temp.data4=987.654;
for(i=0;i<32;i++)
{
   printf("%x,",data.tx_buff);
}
printf("\r\n");



下面是printf的结果
a,ff,23,1,76,98,0,0,db,e9,76,44,c8,46,0,20,c8,46,0,20,c8,46,0,20,0,0,0,0,5f,2,0,8,


上面实现了,你每次nrf发送data.tx_buff就可以了
这种方法的好处是,不用复制不同类型的数据到发送buff还要自己定位了

回复 支持 反对

使用道具 举报

7

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
496
金钱
496
注册时间
2017-12-11
在线时间
63 小时
发表于 2018-4-13 09:05:54 | 显示全部楼层
定义比如说 25.5度 你可以放大十倍后去掉小数,然后 a=255/100=2;   b=255%100/10=5; c=255%10=5; 分别得到温度的每个位 然后转成ascll码a=a+0x30;b=b+0x30; c=c+0x30; 为什么加上0x30,0x30在ascll中对应为0x30,就是说0x30='0',字符型的0. 而非数值0,那么a='2',b='5',c='5'。具体你可以查看ascll码表,这样还有一个好处就是在用串口打印后用文本格式显示方便调试更直观,还有就是限定了数据包中数据部分的组成为0x30-0x39(对应为字符0-9),这样数据包更可靠一些,更容易区分数据包的数据部分和其他部分(如包头包尾)怎么讲呢举个例子;我定义一个传输数据包协议为0xaa(数据包头),a,b,c,0xbb(数据包尾);添加了包头和包尾使其接收端更容易识别,数据传输更可靠。接收端接收后T=(a-0x30)*100+(b-0x30)*10+(c-0x30);//得到放大十倍后的温度,就可以根据需求来用T。  如果说不用ascll格式传输,并且我以简单数据包的形式传输,0xaa, 0xff(255), 0xbb;在这样看来没有问题,假如说我读到的温度是17.0度,放大十倍后是170度,那么就会出现这种情况-0xaa,0xaa(T),0xbb;//这种情况下出现了两个包头,数据接收端就会出错。当然如果不用ascll格式传输也可以,小心使用就行。其实这些数据传输都是一些简单的,自己随便定义,好用就行。像传输一些秘密的数据,为了不容易被别人破解,都对数据进行一些算法加密,而且传输协议也比较复杂,发送的数据需要接收端使用协定好的算法将数据解出。
当然你用的是NRF24L01传输,你不用考虑包头包尾,直接把你要发送的数据,拆开转成ascll的格式,通过指令放入发送缓存寄存器,可能你的数据长度达不到32位,只用了几位,空着就空着不去管就是了,接收端只要判断接收到,就从接收缓存器里读出来就好了,如果是NRF24L01+的话可以调整数据包的长度。具体你可以看一下说明书。
以上均为个人看法。
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2019-9-27
在线时间
19 小时
发表于 2019-9-27 10:57:16 | 显示全部楼层
楼主解决了吗,方便留个QQ之类的联系方式么,我这边nrf+DS18B20用的stm8s做的,上位机串口显示采集温度00,应该是没采集上来,但是调了很久都不知道错在哪里,楼主能帮忙看看么?或者能把程序发给我参考一下吗,谢谢了 948977172@qq.com
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2019-9-27
在线时间
19 小时
发表于 2019-9-27 10:59:23 | 显示全部楼层
轱辘t309065 发表于 2018-4-13 09:05
定义比如说 25.5度 你可以放大十倍后去掉小数,然后 a=255/100=2;   b=255%100/10=5; c=255%10=5; 分别得到 ...

大神你好,我这边nrf+DS18B20用的stm8s做的,上位机串口显示采集温度00,应该是没采集上来,但是调了很久都不知道错在哪里,都快崩溃了,大神能帮忙看看么?或者能把传感器采集数据通过nrf传送的相关程序发给我参考一下吗,谢谢了 948977172@qq.com
回复 支持 反对

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2019-10-24 09:18:57 | 显示全部楼层
通过移位就可以了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-9 21:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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