OpenEdv-开源电子网

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

小白在这里学习了很多东西,该贡献的时候了,发一份IEEE754单精度浮点数转十进制数的源码

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2018-9-30
在线时间
0 小时
发表于 2018-9-30 10:26:07 | 显示全部楼层 |阅读模式
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "string.h"

/*-----采用IEEE754方式将四字节浮点数转十进制数。
经过测试,以下四种方法可用,测试单片机型号:stm32f401----*/


/**
*作用:把u8四字节数组转为float
*note:低地址放float的低字节
**/
float ByteToFloat(u8* str)  
{  
    float data;
    data = *((float*)str);
    return data;
}

/**
*作用:把u8四字节数组转为float
*note:低地址放float的低字节
**/
float ByteToFloat1(u8* byteArray)  
{  
    return *((float*)byteArray);  
}
/**
*作用:把u8四字节数组转为float
*note:低地址放float的低字节
**/
float ByteToFloat2(u8 *a)
{
float tempf=0.0;
memcpy(&tempf,a,4);
return tempf;
}

/**
*作用:把u8四字节数组转为float
*note:低地址放float的低字节
**/
float ByteToFloat3(u8 *byteArray)
{
float f;
u8 *p = (u8*)&f;

p[0]=byteArray[0];

p[1]=byteArray[1];

p[2]=byteArray[2];

p[3]=byteArray[3];
return f;
}



int main(void)
{
// u8 i;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                                                //设置系统中断优先级分组2
        delay_init(168);                                                                                                                                //延时初始化
        uart_init(9600);                                                                                                                                //串口初始化波特率为115200

        while(1)
        {
                float f;
                u8 test[4] = {0x00, 0x85, 0xdc, 0x3d};                                                                                  //输入的数据,高字节到低字节排列
//        f=ByteToFloat(test) ;                                                                                                                        //方法1
        f=ByteToFloat1(test);                                                                                                                        //方法2
//        f=ByteToFloat2(test);                                                                                                                        //方法3
//        f=ByteToFloat3(test);                                                                                                                        //方法4
                printf("\r\n%f\r\n",f);
                delay_ms(1000);
               
               
        }
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

465

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2154
金钱
2154
注册时间
2013-1-11
在线时间
509 小时
发表于 2018-9-30 11:58:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10559
金钱
10559
注册时间
2017-2-18
在线时间
1911 小时
发表于 2018-9-30 12:54:55 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2018-7-30
在线时间
40 小时
发表于 2018-11-22 22:15:50 | 显示全部楼层
简直厉害。。
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2020-9-29
在线时间
26 小时
发表于 2021-6-16 17:07:14 | 显示全部楼层
兄弟 你这个怕不是吧
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2021-6-27
在线时间
35 小时
发表于 2021-8-24 17:13:22 | 显示全部楼层
兄弟用你的代码,得出来的数据不对呀
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2021-6-27
在线时间
35 小时
发表于 2021-8-24 17:13:44 | 显示全部楼层
代码有问题
回复 支持 反对

使用道具 举报

13

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2021-3-6
在线时间
115 小时
发表于 2021-8-24 19:53:50 | 显示全部楼层
直接用共用体就能转吧,
#include <stdio.h>
#include <stdint.h>

union {
        unsigned char uc[4];
        float fda;
} un_4b;

void FtoB(void) {
        unsigned char uca[4];

        un_4b.fda = 1.1;
        uca[0] = un_4b.uc[0];
        uca[1] = un_4b.uc[1];
        uca[2] = un_4b.uc[2];
        uca[3] = un_4b.uc[3];
        for (int i = 0; i < 4; i++)
                printf("%#X  ", uca[i]);
}

int main(int argc, char *argv[]) {
        FtoB();
        return 0;
}
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-6-9
在线时间
47 小时
发表于 2022-8-4 01:44:39 | 显示全部楼层
实测可以,但要懂得数据顺序!
10进制 220.5
16进制 43 5C 80 00

//数组  注意:从低到高位顺序!!
u8 test[4] = {0x00, 0x80, 0x5c, 0x43};  

再套用楼主的程序 就可以得到结果  10进制 220.5
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2023-9-13
在线时间
5 小时
发表于 2023-9-19 09:15:56 | 显示全部楼层
这个程序可以将其它字节数量的单精度浮点型转换成十进制吗,比如2字节、6字节、8字节
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 05:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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