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

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:176
  • 最近打卡:2025-02-19 17:24:49

15

主题

265

回帖

1387

积分

金牌会员

积分
1387
发表于 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
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1837

积分

金牌会员

积分
1837
发表于 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]
复制代码
回复 支持 0 反对 1

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:125
  • 最近打卡:2025-06-04 21:38:29
已绑定手机

60

主题

782

回帖

4027

积分

论坛元老

自定义头衔

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2025-06-16 12:55:15

22

主题

282

回帖

1091

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:178
  • 最近打卡:2025-06-12 08:44:23
已绑定手机

15

主题

628

回帖

822

积分

高级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:459
  • 最近打卡:2025-06-16 00:13:00
已绑定手机

37

主题

2221

回帖

2658

积分

荣誉版主

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:157
  • 最近打卡:2025-05-05 11:14:29

0

主题

2

回帖

322

积分

中级会员

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

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:67
  • 最近打卡:2025-06-16 08:30:05
已绑定手机

17

主题

472

回帖

1341

积分

金牌会员

积分
1341
发表于 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
  • 打卡总天数:455
  • 最近打卡:2025-06-10 13:10:51
已绑定手机

236

主题

340

回帖

1650

积分

金牌会员

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 20:59 , Processed in 0.143852 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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