OpenEdv-开源电子网

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

将AD转换数据写入FLASH中,如果不在每个数据的末尾添加换行\r\n,存入FLASH时如何区分两个数据

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2019-10-15
在线时间
35 小时
发表于 2019-12-3 22:27:31 | 显示全部楼层 |阅读模式
10金钱
如题!!!!!sprintf(result,"%-8.3f",acc);
其中result为 char result[8];  acc为float型数据
在定义一个10个字节的char buff[10];
buff[8] = "\r";
buff[9] = "\n";
然后在将buff写入FLASH
但是这个样子的话,一个数据就要10个字节来存储了
有没有什么好的办法来解决浮点型数据存储和多个数据进行区分的

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6666
金钱
6666
注册时间
2015-8-25
在线时间
1035 小时
发表于 2019-12-4 13:35:42 | 显示全部楼层
float占4byte,用联合体解决
typedef union{
    float  myfloat;
    unsigned char data[4];
}_Float;
定义float型变量时用_Float f;
使用float时用f.myfloat;
存储到flash时用f.data[4]这个数组
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2019-10-15
在线时间
35 小时
 楼主| 发表于 2019-12-4 19:08:19 | 显示全部楼层
szczyb1314 发表于 2019-12-4 13:35
float占4byte,用联合体解决
typedef union{
    float  myfloat;

这个是可以解决,那么连续存储数据的时候怎么在FLASH中区分不同的数据
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-4 19:15:19 | 显示全部楼层
wangjiahao 发表于 2019-12-4 19:08
这个是可以解决,那么连续存储数据的时候怎么在FLASH中区分不同的数据

你是对的,固定长度存储最省事,都flash了也不在乎浪费几个字节
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6666
金钱
6666
注册时间
2015-8-25
在线时间
1035 小时
发表于 2019-12-4 19:28:38 | 显示全部楼层
wangjiahao 发表于 2019-12-4 19:08
这个是可以解决,那么连续存储数据的时候怎么在FLASH中区分不同的数据

所有要存储的数据组织到一个结构体中,
如下的定义可以得到成员在结构体中的偏移:
#define FPOS(type,field) ((unsigned int)&((type *)0)->field)
连续存储数据读取出来就是一个buff也看作是一个数组,利用偏移是不是可以得到具体的成员内容???
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6666
金钱
6666
注册时间
2015-8-25
在线时间
1035 小时
发表于 2019-12-4 19:29:00 | 显示全部楼层
所有要存储的数据组织到一个结构体中,
如下的定义可以得到成员在结构体中的偏移:
#define FPOS(type,field) ((unsigned int)&((type *)0)->field)
连续存储数据读取出来就是一个buff也看作是一个数组,利用偏移是不是可以得到具体的成员内容???
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-5 09:36:24 | 显示全部楼层
szczyb1314 发表于 2019-12-4 19:29
所有要存储的数据组织到一个结构体中,
如下的定义可以得到成员在结构体中的偏移:
#define FPOS(type,fi ...

所有数据存一次用结构体就没偏移的事   结构体长度固定也是等于定长  你那种结构体内部记忆自己长度结构体不定长没法随机读取每次只能从第一个读
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6666
金钱
6666
注册时间
2015-8-25
在线时间
1035 小时
发表于 2019-12-5 10:28:50 | 显示全部楼层
nashui_sx 发表于 2019-12-5 09:36
所有数据存一次用结构体就没偏移的事   结构体长度固定也是等于定长  你那种结构体内部记忆自己长度结构 ...

若是你的程序是想起来要存储一个数据就马上存一个,过一会又要存储另一个又马上存储一个。完全是随心所欲的想起来要存就存,完全是来一个存一个,也不知道哪一个先来,也不知道会有多少数据要存,那我这方法肯定不行,因为你就没有办法组织你要存储的数据,同时若你的数据太多flash也不够你用。

我的意思是程序已经确定了要存储那些数据的情况下,组织在结构体中存储在flash中的地址 x 处,你要读取哪个变量就用这个变量在结构体的偏移量+ x 去读取flash,
#pragma pack(push,1)
struct test{
        unsigned char a;
        unsigned short b;
        unsigned int c;
};
#pragma pack(pop)
#define FPOS(type,field) ((unsigned int)&((type *)0)->field)  //得到成员的偏移
#define FSIZ(type,field) sizeof(((type *)0)->field)          //得到成员的大小
现在把一个struct test存到falsh的100地址处,你要用a,就读100处a的大小字节数据就行了,用b就读100+b的偏移处b的大小字节就行。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-5 10:40:04 | 显示全部楼层
szczyb1314 发表于 2019-12-5 10:28
若是你的程序是想起来要存储一个数据就马上存一个,过一会又要存储另一个又马上存储一个。完全是随心所欲 ...

配置类信息都是你这么存的没问题

用户数据这么存不行,比如flash多次存门禁卡的的{账户;密码;姓名}结构体 不定长没法查询插入删除新的用户(结构体已经是定长,但是为了方便换算偏移,一般结构体对10取整好点)

他的ad数据也是,来一组{ad1  ad2  ad3  ad...} 存一次 也是需要定长的

你那种是说的多次存储中的一次的数据存储解析,他需要的是再扩展一级,多次存结构体
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6666
金钱
6666
注册时间
2015-8-25
在线时间
1035 小时
发表于 2019-12-5 11:10:41 | 显示全部楼层
nashui_sx 发表于 2019-12-5 10:40
配置类信息都是你这么存的没问题

用户数据这么存不行,比如flash多次存门禁卡的的{账户;密码;姓名} ...

你说的插入、删除 感觉类似ucos 的 malloc动态分配内存一样了,
一个二位数组 array[50][10];
get 一次分配掉一个10字节的内存 == 插入
put 一次回收一个10字节的内存(又可以被再次get) == 删除
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 20:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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