OpenEdv-开源电子网

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

stm32中double型如何转化为uchar数组

[复制链接]

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
发表于 2016-11-5 16:49:00 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-11-7 10:05:56 | 显示全部楼层
chenghuayou 发表于 2016-11-5 20:05
您好,再次感谢您的回答,令我受益很多,不过请问一下,如何才能将这八个字节转换成原有的double型,并且 ...

double data = 3.1415926;
double temp = 0;
unsigned char buffer[8] = {0, 0};

memcpy(buffer, (unsigned char *)&data, 8);

temp = *(double *)&buffer;

printf("\r\n%lf\r\n", temp);
printf("\r\n%lf\r\n", *(double *)&buffer);
回复 支持 1 反对 0

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-11-5 17:43:42 | 显示全部楼层
chenghuayou 发表于 2016-11-5 17:32
请问一下,如何再将这八个字节转换成原有的double型呢

double data = 3.1415926;
unsigned char buffer[8] = {0, 0};

memcpy(buffer, (unsigned char *)&data, 8);

printf("\r\n%lf\r\n", *(double *)&buffer);
回复 支持 1 反对 0

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-11-5 17:12:48 | 显示全部楼层
double data = 3.1415926;
unsigned char buffer[8] = {0, 0};

memcpy(buffer, (unsigned char *)&data, 8);
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-5 17:27:50 | 显示全部楼层
BMN李 发表于 2016-11-5 17:12
double data = 3.1415926;
unsigned char buffer[8] = {0, 0};

您好,非常感谢您耐心的解答,unsigned char buffer[8] = {0, 0};这句话中的{0,0}为什么只有两个零,代表什么意思呢?非常感谢
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-5 17:32:09 | 显示全部楼层
BMN李 发表于 2016-11-5 17:12
double data = 3.1415926;
unsigned char buffer[8] = {0, 0};

请问一下,如何再将这八个字节转换成原有的double型呢
回复 支持 反对

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-11-5 17:33:43 | 显示全部楼层
chenghuayou 发表于 2016-11-5 17:27
您好,非常感谢您耐心的解答,unsigned char buffer[8] = {0, 0};这句话中的{0,0}为什么只有两个零,代表 ...

这是我的习惯性写法。就是一个赋初值,都赋值为0,你写1个0或者8个0都一样,剩下的自动赋值为0。
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-5 17:40:19 | 显示全部楼层
BMN李 发表于 2016-11-5 17:33
这是我的习惯性写法。就是一个赋初值,都赋值为0,你写1个0或者8个0都一样,剩下的自动赋值为0。

奥奥,明白了,非常感谢您的耐心解答,请问一下,如何再将这八个字节转换成原有的double型呢?也就是说,分成的这八个字节,非别对应的double型的哪几位呢?----------万分感谢!!!
回复 支持 反对

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-5 17:46:50 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-11-5 17:51 编辑

定义联合体,分别定义一个double和一个uchar型数组即可。
union _val
{
   unsigned char Buf[4];
  double   d;
};

union _val  val;

val.Buf和val.d公用内存自动转换,这就是共用体的优势。
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-5 20:05:11 | 显示全部楼层
BMN李 发表于 2016-11-5 17:43
double data = 3.1415926;
unsigned char buffer[8] = {0, 0};

您好,再次感谢您的回答,令我受益很多,不过请问一下,如何才能将这八个字节转换成原有的double型,并且保存住这个double型数据呢?而不仅仅是打印出来?(比如用CAN通讯先将这个double型数据转换成uchar型数组,发送到下位机,然后下位机如何将这个uchar型数组重新组合成原有的double型数据呢?)--------实在是给您添麻烦了--------非常感谢您!!
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-5 20:36:43 | 显示全部楼层
shuaigew88 发表于 2016-11-5 17:46
定义联合体,分别定义一个double和一个uchar型数组即可。
union _val
{

您好,再次感谢您的回答,令我受益很多,不过请问一下,如何才能将这八个字节转换成原有的double型,并且保存住这个double型数据呢?而不仅仅是打印出来?(比如用CAN通讯先将这个double型数据转换成uchar型数组,发送到下位机,然后下位机如何将这个uchar型数组重新组合成原有的double型数据呢?)--------实在是给您添麻烦了--------非常感谢您!!
回复 支持 反对

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-5 20:53:22 | 显示全部楼层
chenghuayou 发表于 2016-11-5 20:36
您好,再次感谢您的回答,令我受益很多,不过请问一下,如何才能将这八个字节转换成原有的double型,并且 ...

保存的时候将buf数组中的4个字节按照整数的方式保存就OK,读取的时候也是读取到共用体成员buf中,然后调用成员d就是原始数据。
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-5 22:30:50 | 显示全部楼层
shuaigew88 发表于 2016-11-5 20:53
保存的时候将buf数组中的4个字节按照整数的方式保存就OK,读取的时候也是读取到共用体成员buf中,然后调 ...

您好,非常感谢您的解答,请问一下,假如我的数据是3.1415926,如何把这个数据给赋给d呢?或者说我这里有一组a[1,2,3,4]如何赋给Buf[4]呢?
回复 支持 反对

使用道具 举报

7

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-10-11
在线时间
43 小时
发表于 2016-11-5 23:25:35 | 显示全部楼层
union   用联合啊,,, 一个double    一个u8  a[4]
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-5 23:37:54 | 显示全部楼层
dingyu000111 发表于 2016-11-5 23:25
union   用联合啊,,, 一个double    一个u8  a[4]

能举个具体的例子吗,非常感谢您的回答
回复 支持 反对

使用道具 举报

7

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-10-11
在线时间
43 小时
发表于 2016-11-5 23:43:31 | 显示全部楼层
很简单的,,,你百度,先学习一下union  。。其次你用JLINK仿真看看,,,记住,小段模式的。。。得到的数据要反一下
回复 支持 反对

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-6 08:44:56 | 显示全部楼层
chenghuayou 发表于 2016-11-5 22:30
您好,非常感谢您的解答,请问一下,假如我的数据是3.1415926,如何把这个数据给赋给d呢?或者说我这里有 ...

union _val
{
   uchar buf[4];
   double d;
};

union _val val;

val.d =3.1415926;
按照整数方式将buf的4个元素保存至如EEPROM,这里说的保存就是3.1415926,不需要你去操作val.d,因为buf和d两个成员是公用内存,操作buf就是操作d编译器会自动将用户给定的值按照小数的形式保存在d中同时按照整数的方式保存在buf中。

数据从eeprom读取时按照4字节高低顺序保存至buf中然后操作val.d时数据就是3.1415926,如果你还不能理解就去好好学习C语言基础。
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-6 08:51:45 | 显示全部楼层
shuaigew88 发表于 2016-11-6 08:44
union _val
{
   uchar buf[4];

非常感谢您的耐心解答————真的十分感谢!我明白您所表达的意思了。
回复 支持 反对

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-6 08:55:30 | 显示全部楼层
chenghuayou 发表于 2016-11-6 08:51
非常感谢您的耐心解答————真的十分感谢!我明白您所表达的意思了。

有一点搞错了,double占用8个字节,所以union中的buf数组成员是8
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-6 09:03:51 | 显示全部楼层
shuaigew88 发表于 2016-11-6 08:55
有一点搞错了,double占用8个字节,所以union中的buf数组成员是8

恩恩,这个我知道,感谢您的耐心讲解
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 00:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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