找回密码
 立即注册
查看: 1286|回复: 8

可以这样在eeprom中保存浮点数

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:187
  • 最近打卡:2026-03-12 08:01:23

16

主题

274

回帖

1473

积分

金牌会员

积分
1473
发表于 2024-11-3 20:28:25 | 显示全部楼层 |阅读模式
大家知道浮点数无论双精度还是单精度都占用4个字节,如果需要断电保持数据,最好把它们保存在eeprom中,经过实验可以用下面的程序来做。



unsigned char uid[4];
unsigned char *point1;
float floaa,floab;

void PassNumber()
{
floaa=56.2345;
point1=(char*)&floaa;
uid[0]=*point1;
point1++;
uid[1]=*point1;
point1++;
uid[2]=*point1;
point1++;
uid[3]=*point1;
//在此处将uid数组存到pporom断电(略)
//再次来电后
//再开机从epprom中去除数据到数组(略)
point1=(char*)&floab;
*point1=uid[0];
  point1++;
*point1=uid[1];
  point1++;
  *point1=uid[2];
  point1++;
  *point1=uid[3];
floaa=floab;

}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:296
  • 最近打卡:2026-01-08 10:11:26

9

主题

315

回帖

1855

积分

金牌会员

积分
1855
发表于 2024-11-3 21:12:30 | 显示全部楼层
用联合体啊
  1. union {
  2.         float Dat_f;
  3.         char Dat_C[4];
  4. }EEProm_Union;
  5. EEProm_Union.Dat_f = 0.1234;
  6. 存取EEProm_Union.Dat_C[0] ~ EEProm_Union.Dat_C[3]
复制代码
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:126
  • 最近打卡:2025-09-03 12:23:58
已绑定手机

60

主题

776

回帖

4025

积分

论坛元老

自定义头衔

积分
4025
发表于 2024-11-3 21:30:37 | 显示全部楼层
也可以void*类型指针直接传,或许是更优雅的做法

把float类型的数据cast成char,这种做法本身是不优雅、不严谨的
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:466
  • 最近打卡:2026-02-08 20:24:31
已绑定手机

23

主题

280

回帖

1854

积分

金牌会员

积分
1854
发表于 2024-11-3 21:52:54 | 显示全部楼层
REMOVEUNUSED
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2026-02-14 08:46:29
已绑定手机

15

主题

621

回帖

756

积分

高级会员

积分
756
发表于 2024-11-3 22:33:46 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:706
  • 最近打卡:2026-04-06 17:33:01
已绑定手机

49

主题

2650

回帖

2907

积分

荣誉版主

积分
2907
发表于 2024-11-3 22:35:28 | 显示全部楼层
其实,方法很多,指针强制类型转换除了能应付各种单位变量,也可以将结构体类型或大数组写入EEPROM,
共用体(联合体)的优势是简单可靠,易于理解,特别适合严谨的应用和新手小白。
~~~
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:160
  • 最近打卡:2025-09-26 11:46:44

0

主题

2

回帖

338

积分

中级会员

积分
338
发表于 2024-11-4 09:12:19 | 显示全部楼层
可以试试联合体
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:258
  • 最近打卡:2026-04-03 17:30:28
已绑定手机

22

主题

633

回帖

2346

积分

金牌会员

积分
2346
发表于 2024-11-8 09:50:51 | 显示全部楼层
本帖最后由 bkeuqoaq 于 2024-11-8 09:52 编辑

实际做法是将所有要保存的变量放在结构体中,,存储整个结构体(将整个结构体当成字节数组),读取时也是类似,连续读取EEPROM数据到结构体首地址,不需要其它特殊操作了

        if (EEPROM_SaveStruct() == 1)
        {
                OLED_ShowStrCpl(128-11*6, 7, "SAVE-1", 0xffff);
                INT_TickDelay(500ms);
                OLED_ShowStr(128-11*6, 7, "      ");
        }
        else
        {
                OLED_ShowStrCpl(128-11*6, 7, "SAVE-0", 0xffff);
                INT_TickDelay(500ms);
                OLED_ShowStr(128-11*6, 7, "      ");
        }


u8 EE_Restore(void)
{
    if (1)
    {
        MenuSet_Typedef* pTask = &g_stMenuSet;
        AT24X_Read(ADDR__MENU_SET, sizeof(g_stMenuSet), (u8*)pTask);
        if (pTask->ulInitFlag != EE_INIT_OK_FLAG__MENU)
        {
            EE_ResetMenuSet(0);
        }
    }

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2026-04-06 16:24:18
已绑定手机

276

主题

415

回帖

2264

积分

金牌会员

积分
2264
发表于 2024-11-8 10:25:37 | 显示全部楼层
直接用结构体
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-6 17:59 , Processed in 0.116716 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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