硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7729|回复: 11
收起左侧

[有问必答] EEPROM存取浮点型数据

[复制链接]

12

主题

26

回帖

114

积分

初级会员

积分
114
发表于 2014-12-10 17:22:41 | 显示全部楼层 |阅读模式
如题,我定义了一个浮点数组 float buf[10]={100.00,100.39,100.78,101.17,101.56,101.95,102.34,102.73,103.12,103.51};
写EEPROM的时候强制转换  if (ee_WriteBytes((uint8_t *)buf, 0, EE_SIZE) == 0)
读的时候也是 if (ee_ReadBytes((uint8_t *)buf, 0, EE_SIZE) == 0)
串口输出的话 是printf(" %0.2f", (float *)buf);?还是printf(" %0.2f",buf);
貌似都不对啊,输出来的数据都不是理论数据
该怎么处理呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2014-12-10 17:33:03 | 显示全部楼层
浮点数是占了4个字节的,你获取这个浮点数的地址,然后将这个地址开始的四个字节保存到EEPROM里面就行。详细实现看这里的EEPROM存取浮点的帖子,很多,你选择一个适合你的。
http://www.amobbs.com/search.php ... +%E6%B5%AE%E7%82%B9
回复

使用道具 举报

12

主题

26

回帖

114

积分

初级会员

积分
114
 楼主| 发表于 2014-12-10 17:36:35 | 显示全部楼层

回 eric2013 的帖子

eric2013:浮点数是占了4个字节的,你获取这个浮点数的地址,然后将这个地址开始的四个字节保存到EEPROM里面就行。详细实现看这里的EEPROM存取浮点的帖子,很多,你选择一个适合你的。
http://www.amobbs.com/search.php ... mp;amp;ascdesc=desc .. (2014-12-10 17:33) 
我没有阿莫的户头……能不能贴到咱论坛里来[s:130]
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2014-12-10 17:37:23 | 显示全部楼层

回 361901725 的帖子

361901725:我没有阿莫的户头……能不能贴到咱论坛里来[s:130] (2014-12-10 17:36) 
好多帖子呢,内容太多。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2014-12-10 17:38:03 | 显示全部楼层
那就百度吧,这种常见问题很多解答的:http://www.baidu.com/s?wd=EEPROM ... amp;amp;inputT=5720
回复

使用道具 举报

12

主题

26

回帖

114

积分

初级会员

积分
114
 楼主| 发表于 2014-12-10 20:11:29 | 显示全部楼层

回 eric2013 的帖子

eric2013:那就百度吧,这种常见问题很多解答的:http://www.baidu.com/s?wd=EEPROM ... 1&rsv_sug1= .. (2014-12-10 17:38) 
[s:140]
回复

使用道具 举报

3

主题

60

回帖

69

积分

初级会员

积分
69
发表于 2014-12-16 10:53:31 | 显示全部楼层
浮点数不是这样存储的~~等下我发个代码上来~~
回复

使用道具 举报

3

主题

60

回帖

69

积分

初级会员

积分
69
发表于 2014-12-16 10:59:53 | 显示全部楼层
xxx.h:

typedef union{
    float v;
    char  vc[4];
}CHANGE_VALUE;

xxx.c:
void xxx(void){
    CHANGE_VALUE changeV;
   
    //获取浮点数值
    changeV.v = getADxValue(4);
   
    //存储浮点数值
    eepWrite(changeV.vc[0], changeV.vc[1], changeV.vc[2], changeV.vc[3]);

    //验证清0
    memset(changeV.vc, 0, 4);

    //读浮点数值
    eepRead(&changeV.vc[0], &changeV.vc[1], &changeV.vc[2], &changeV.vc[3]);

    printf("%f", changeV.v);
}
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2014-12-19 15:32:44 | 显示全部楼层
浮点数的编码和转换建议用union来操作很省心。
定义一个union类型,想取单字节的码也行,想取完整的浮点数也行!
union floatchar
{
float i;
char code[4];
}
回复

使用道具 举报

12

主题

26

回帖

114

积分

初级会员

积分
114
 楼主| 发表于 2014-12-24 09:15:55 | 显示全部楼层

回 ap0405209 的帖子

ap0405209:xxx.h:

typedef union{
    float v;
    char  vc[4];
....... (2014-12-16 10:59) 
我给数据乘了100,存的整形,取出来再除以100,偷了个懒,貌似结果还可以
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2014-12-24 09:56:50 | 显示全部楼层

回 361901725 的帖子

361901725:我给数据乘了100,存的整形,取出来再除以100,偷了个懒,貌似结果还可以 (2014-12-24 09:15)
你这个方法不好。
1. 损失精度
2.使用了乘法,占用cpu,而且有可能溢出。
3.数据范围明显缩小,适应性差很多。

本来你的强制转换是没有问题的,应该用printf(" %0.2f", *(float *)buf);  注意,比你的写法多了个*
只是需要注意,在存取EEPROM的时候,注意长度。比如你是10个float数字,buf内存实际占用40个字节。EEPROM函数应该存储40个字节;读取也是40个字节。
回复

使用道具 举报

10

主题

21

回帖

51

积分

初级会员

积分
51
发表于 2015-1-16 21:25:13 | 显示全部楼层
我觉得先乘,再除,没什么不好,当然,要多取一位数
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 18:22 , Processed in 0.045877 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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