OpenEdv-开源电子网

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

【求助】关于数据保存的问题。

[复制链接]

8

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2016-8-2
在线时间
30 小时
发表于 2017-7-8 13:43:10 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 刘毅壁虎 于 2017-7-8 13:44 编辑

程序需要对传感器数据进行采集,并按照“年,月,日,测量结果”的格式将数据进行保存。年,月,日和测量结果前期我分别用的独立的变量完成赋值。现在我想将这几个独立的变量以结构体的形式整体保存到flash里去。方便后期的读写以及使用。

具体如下:
typedef struct
{
        uint Year;
        uint Month;
        uint Date;
        float Press;
}DataTypeDef;

DataTypeDef DataStruct;

uint Year=17;
uint Month=7;
uint Date=01;
float Press=100000;

DataStruct.Year=Year;
DataStruct.Month=Month;
DataStruct.Date=Date;
DataStruct.Press=Press;

WriteBuffer(DataStruct);


但是当需要采集的数据种类更多时,采用红色部分的算法会感觉很奇怪,能否通过别的方法实现?

最佳答案

查看完整内容[请看2#楼]

研究了半天,发现还是直接赋值这种方法,最为简单可行。 其实我在一开始进行数据采集的时候就应该统筹规划,采用结构体的形式保存。方便后期的存储。而不是后来再逐个赋值到结构体中
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2016-8-2
在线时间
30 小时
 楼主| 发表于 2017-7-8 13:43:11 来自手机 | 显示全部楼层
yklstudent 发表于 2017-7-9 08:31
你测试验证过??????

研究了半天,发现还是直接赋值这种方法,最为简单可行。
其实我在一开始进行数据采集的时候就应该统筹规划,采用结构体的形式保存。方便后期的存储。而不是后来再逐个赋值到结构体中
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
发表于 2017-7-8 14:30:27 | 显示全部楼层
哪里奇怪了?感觉固件库的初始化也是这么做的、、
回复

使用道具 举报

300

主题

1420

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7826
金钱
7826
注册时间
2015-10-15
在线时间
2865 小时
发表于 2017-7-8 17:15:42 | 显示全部楼层
这一点也不奇怪哦。这是一种很通用的做法。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2016-8-2
在线时间
30 小时
 楼主| 发表于 2017-7-8 22:15:37 | 显示全部楼层
yklstudent 发表于 2017-7-8 17:04
楼主认为有什么高级的赋值算法?

sprintf((char*)&DataStruct,"%c%c%c%c",Year,Month,Date,Press);
这样写貌似是可以实现同样的功能,但是Press的数据会出问题,别的几个是u8类型的,Press是float型的,具体原因还在研究。
回复

使用道具 举报

8

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2016-8-2
在线时间
30 小时
 楼主| 发表于 2017-7-8 22:17:00 | 显示全部楼层
openedvadmin 发表于 2017-7-8 17:15
这一点也不奇怪哦。这是一种很通用的做法。

我的这部分代码只是举个例子,实际的变量要多出许多。后期可能还会增加。所以想搞一个好维护的方法
回复

使用道具 举报

8

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2016-8-2
在线时间
30 小时
 楼主| 发表于 2017-7-8 22:17:30 | 显示全部楼层
执迷 发表于 2017-7-8 14:30
哪里奇怪了?感觉固件库的初始化也是这么做的、、

这样子的程序感觉效率好低
回复

使用道具 举报

8

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2016-8-2
在线时间
30 小时
 楼主| 发表于 2017-7-8 22:37:32 | 显示全部楼层
yklstudent 发表于 2017-7-8 22:23
你这样的效率高?????

不知道啊,按照机器的运算周期,应该是更快一些吧
回复

使用道具 举报

8

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2016-8-2
在线时间
30 小时
 楼主| 发表于 2017-7-8 22:54:13 | 显示全部楼层
用memccpy();的方式貌似也存在问题,每次只能拼接两个变量。请问大家,多个变量的拼接要使用怎么的方法能够表达出来那??
回复

使用道具 举报

8

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2016-8-2
在线时间
30 小时
 楼主| 发表于 2017-7-8 23:07:35 | 显示全部楼层
刘毅壁虎 发表于 2017-7-8 22:15
sprintf((char*)&DataStruct,"%c%c%c%c",Year,Month,Date,Press);
这样写貌似是可以实现同样的功能,但 ...

float型数据在内存中存储的时候,所占用的存储空间有某种类似对其的要求。也就是说,Date与Press的存储地址不是连续的,中间有几个存储位置浪费掉了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-18 12:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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