OpenEdv-开源电子网

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

利用共用体进行无线传输

[复制链接]

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
发表于 2019-4-3 16:13:11 | 显示全部楼层 |阅读模式
利用共用体进行浮点数的传输,但是只能传输一个浮点数,如果我要传输多个浮点数,应该怎么做?跪求各位大神的解答!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4095
金钱
4095
注册时间
2018-8-14
在线时间
694 小时
发表于 2019-4-3 16:22:58 | 显示全部楼层
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-3 16:33:21 | 显示全部楼层
edmund1234 发表于 2019-4-3 16:22
用结构体+子针转换

麻烦能够说具体一点吗,不是很懂,谢谢了
回复 支持 反对

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4095
金钱
4095
注册时间
2018-8-14
在线时间
694 小时
发表于 2019-4-3 16:37:58 | 显示全部楼层
typedef struct  DataPack{
  u16 Header;
  u16 CheckSum;
float Data[256];
}dataPack;
回复 支持 反对

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4095
金钱
4095
注册时间
2018-8-14
在线时间
694 小时
发表于 2019-4-3 16:44:06 | 显示全部楼层
接收到的数据, 转换为结构体

u8 RxData[1024];

struct  DataPack* ptr = (struct  DataPack*) RxData;

然后就可以用ptr来操作结构体, 比如
if (ptr->Header == 0x1234)
又或数据
float  data = ptr->Data[0];
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-3 16:44:12 | 显示全部楼层
edmund1234 发表于 2019-4-3 16:37
typedef struct  DataPack{
  u16 Header;
  u16 CheckSum;

比如说我要通过nrf24l01无线传输0.124和1.234两个浮点数,利用您给的结构体怎么操作
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-3 16:45:35 | 显示全部楼层
edmund1234 发表于 2019-4-3 16:37
typedef struct  DataPack{
  u16 Header;
  u16 CheckSum;

我通过利用联合体能够实现一个浮点数的无线传输,但是不能实现多个不同浮点数的传输,
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-3 16:47:48 | 显示全部楼层
edmund1234 发表于 2019-4-3 16:44
接收到的数据, 转换为结构体

u8 RxData[1024];

您是说发送方利用联合体进行传输,接收方利用结构体吗
回复 支持 反对

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4095
金钱
4095
注册时间
2018-8-14
在线时间
694 小时
发表于 2019-4-3 16:50:18 | 显示全部楼层
如果说你只是发送数据, 而不需要包头校对等, 就连结构体也不用

float data[8] ={1.23, 2.34,.....}
u8* ptr = (u8*)data;
u16 len = sizeof(data)*sizeof(float);

然后就用 ptr及len来发送数据
回复 支持 反对

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4095
金钱
4095
注册时间
2018-8-14
在线时间
694 小时
发表于 2019-4-3 16:53:44 | 显示全部楼层
接收方就反过来做啊

u8 RxData[256];
float *data;

data = (float*)RxData;

然后就可以把data当数组的读写, 比如
float abc = data[2];
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-3 16:56:14 | 显示全部楼层
edmund1234 发表于 2019-4-3 16:50
如果说你只是发送数据, 而不需要包头校对等, 就连结构体也不用

float data[8] ={1.23, 2.34,.....}

好的,我去试试,谢谢了
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-3 17:25:11 | 显示全部楼层
edmund1234 发表于 2019-4-3 16:53
接收方就反过来做啊

u8 RxData[256];

我刚才试了一下,用串口助手显示的数据不对,无线传输用的nrf24l01
回复 支持 反对

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4095
金钱
4095
注册时间
2018-8-14
在线时间
694 小时
发表于 2019-4-3 20:32:08 | 显示全部楼层
lookae 发表于 2019-4-3 17:25
我刚才试了一下,用串口助手显示的数据不对,无线传输用的nrf24l01

你用什么方式发到串口助手?
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-3 21:44:20 | 显示全部楼层
本帖最后由 lookae 于 2019-4-3 21:50 编辑
edmund1234 发表于 2019-4-3 20:32
你用什么方式发到串口助手?

我是这样做的:float data[2]={1.23,2.34}; u8* ptr=(u8*)data;NRF24L01_Txpacket(ptr);printf("%d\n",(u8)ptr);串口助手显示的是104,
回复 支持 反对

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4095
金钱
4095
注册时间
2018-8-14
在线时间
694 小时
发表于 2019-4-3 22:45:15 | 显示全部楼层
printf("%f, %f\n",*((float*)ptr), *((float*)ptr+1));
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-3 22:59:18 | 显示全部楼层
edmund1234 发表于 2019-4-3 22:45
printf("%f, %f\n",*((float*)ptr), *((float*)ptr+1));

好的,我去试试,太谢谢了
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-4 09:41:19 | 显示全部楼层
edmund1234 发表于 2019-4-3 22:45
printf("%f, %f\n",*((float*)ptr), *((float*)ptr+1));

再麻烦一下,接收方怎么用printf显示一下接收到的数据?
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-4 09:51:36 | 显示全部楼层
lookae 发表于 2019-4-4 09:41
再麻烦一下,接收方怎么用printf显示一下接收到的数据?

printf("%f,%f\n",data[0],data[1]);这样做就可以了吗?
回复 支持 反对

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4095
金钱
4095
注册时间
2018-8-14
在线时间
694 小时
发表于 2019-4-4 11:36:33 | 显示全部楼层
lookae 发表于 2019-4-4 09:51
printf("%f,%f\n",data[0],data[1]);这样做就可以了吗?

接收方接收的应该是byte的数组, 同上面同样的方法转换便可以了

u8 RxData[256];  // 比如接收数据是放在此u8数组

float* fData = RxData;
printf("%f,%f\n",fData[0],fData[1]);
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-9 09:06:28 | 显示全部楼层
edmund1234 发表于 2019-4-4 11:36
接收方接收的应该是byte的数组, 同上面同样的方法转换便可以了

u8 RxData[256];  // 比如接收数据是 ...

非常感谢
回复 支持 反对

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
 楼主| 发表于 2019-4-13 22:00:08 | 显示全部楼层
edmund1234 发表于 2019-4-4 11:36
接收方接收的应该是byte的数组, 同上面同样的方法转换便可以了

u8 RxData[256];  // 比如接收数据是 ...

如果我发送大于32个字节的数据,网上说分包发送,请问大神知道怎么做吗?在网上没有找到具体的做法,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-10 05:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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