OpenEdv-开源电子网

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

请教“SD卡文本写入问题”

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-2-28
在线时间
0 小时
发表于 2012-3-1 22:08:09 | 显示全部楼层 |阅读模式
各位大侠:
            本人菜鸟,刚接触不久,现在遇到的问题是STM32,SDIO方式控制SD卡,在当前卡内建立文本文件,如123.txt,并写入相关内容。但是我下次又要写入不同的内容到这个123.txt文件,并写入上次内容的后面,怎样实现?

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-3-1 22:22:27 | 显示全部楼层
前面的步骤你实现了么?
实现了就用读写方式打开123.txt即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-3-2 09:35:57 | 显示全部楼层
前面的步骤实现了,可是用读写方式打开也不行啊。
//res = f_open(&fsrc, "123.txt", FA_CREATE_ALWAYS  | FA_WRITE);  

res = f_open(&fsrc, File_Name, FA_CREATE_ALWAYS );
res = f_open(&fsrc, File_Name, FA_READ | FA_WRITE);
f_write(&fsrc,&fc1,sizeof(fc1),&bw);     //写数据
f_write(&fsrc,&fc2,sizeof(fc2),&bw);     //写数据
f_write(&fsrc,&ADValue,sizeof(ADValue),&bw);  //写数据

同时,对f_lseek(&fsrc,fsrc.fsize);     不了解,望给于解答,谢谢!

非常感谢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-3-2 09:49:50 | 显示全部楼层
以读写方式打开应该是可以的。
lseek就是在文件里面定位地址的,具体你可以看看官网的介绍。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-3-2 10:04:47 | 显示全部楼层
你看我上面的程序对吗?读写方式打开。按理说,如果成功,那就是我每复位一次系统按键,就会往卡里写入一次数据,并且不会覆盖之前的数据。应该怎样具体实现啊?
   谢谢!
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2012-3-3 01:46:03 | 显示全部楼层
res = f_open(&file, "123.txt", FA_READ | FA_WRITE | FA_OPEN_ALWAYS);//打开文件
res = f_lseek(&file, f_size(&file));//把指针指向文件末端
res = f_write(&file, &data, sizeof(data), &bw);//写入文件  

f_lseek就是把文件的指针指定到某个位置,打开文件时指针是指向0的,就是进行写入操作会从第0个字节开始,f_size()或者file->fsize是file的属性,就是文件的大小。
把文件的大小放到f_lseek,就是把指针放到文件末端再加一个字节,因为超出文件大小,f_lseek会把文件增大一个字节的,这时前面的数据就不会被覆盖。
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-3-3 12:06:22 | 显示全部楼层
非常感谢shihantu,我明白了我为什么加了res = f_lseek(&file, (&file)->fsize);或者res = f_lseek(&file,file.fsize);  
还是不能实现。因为在调用res = f_open(&file, "123.txt", FA_READ | FA_WRITE | FA_OPEN_ALWAYS);的时候,我写成res = f_open(&fsrc, File_Name, FA_CREATE_ALWAYS | FA_WRITE | FA_READ); 
就是因为这个顺序原因。所以在打开文件时“读”必须放在最前面,这样在调用了f_open后,file.fsize便有文件当前大小值,否则,file.fsize值始终为0,即使调用f_lseek,也不能实现。

谢谢!
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-3-3 12:09:53 | 显示全部楼层
"123.txt",可调用File_Name,以创建不同的文件名。再次说明,“读”:FA_READ必须放在最前面,才可实现。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-3-3 15:10:42 | 显示全部楼层
回复【7楼】cug_wxf:
---------------------------------
不是吧,这样还有影响?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-3-3 16:37:11 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
是的,我单步运行测试了。
回复 支持 反对

使用道具 举报

3

主题

14

帖子

1

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2012-1-26
在线时间
0 小时
发表于 2012-3-18 10:51:56 | 显示全部楼层
回复【10楼】cug_wxf:
---------------------------------
我怎么感觉是后面的属性你把 FA_OPEN_ALWAYS写成FA_CREATE_ALWAYS ;
FA_CREATE_ALWAYS 是无论如何创建一个新文件,不管文件是否存在,这样复位肯定不会追加,而是创建新文件写入内容
FA_OPEN_ALWAYS    只是打开存在文件;
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-7-22
在线时间
0 小时
发表于 2012-7-24 20:23:22 | 显示全部楼层
回复【7楼】cug_wxf:
---------------------------------
世上无难事,只怕有心人啊!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-8-6
在线时间
0 小时
发表于 2014-8-6 10:57:28 | 显示全部楼层
楼主实现了吗, 有没有源码参考一下啊,急
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-10-9
在线时间
0 小时
发表于 2014-8-23 19:56:59 | 显示全部楼层
回复【6楼】shihantu:
---------------------------------
请问用STM32控制SD卡如何在建立的txt文档中换行写入内容
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2014-8-24 12:35:56 | 显示全部楼层
回复【14楼】LIURENG:
---------------------------------
换行是"\r\n",16进制的0xd,0xa,参考ASCII,与STM32和SD卡无关.

有点探索精神的话,用电脑在记事本写个回车,然后用16进制打开看看.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
发表于 2014-11-3 16:30:26 | 显示全部楼层
回复【15楼】shihantu:
请问,ADC采集的波形数据,如果有负数应该怎么处理,我用的芯片是lpc1343采集范围是0-3.3v.另:如何能够有这个芯片采集一个VPP大约为10v的波形。
小弟在此,跪谢各位予以援手的大神们,小弟是新手。希望大神们可以指导。
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2014-11-3 19:29:26 | 显示全部楼层
回复【16楼】Mars_man:
---------------------------------
1. 这个应该问你的应用打算怎么处理 . 你想输出负数就加个负号 , 想输出寄存器原始格式数据就输出原始格式数据 .

2. 使用电阻分压 , 或者使用缓冲器 . 直接输入这个电压的AD很贵 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
发表于 2014-11-3 21:31:51 | 显示全部楼层
回复【17楼】shihantu:
------------------------
首先跪谢shihantu先生的指导。
我的ADC转换程序流程是:AD产生中断,进入中断程序后,将ADC数据寄存器,也就是AD0DR0中的转换结果赋给一个数组ADC_VALUE[],之后我再把这个数组强制转换成int型,再把int型数据用itoa转为字符型,最后存入SD卡。
不知道您能理解我的意思不?还是觉得我这种做法很不成熟,不知道我这种做法要如何才能把符号加进去。因为我的芯片智能检测0-3.3v,如果是负数的号,就直接测得的数据是0.
望您指点,感激不尽,谢谢!!
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2014-11-3 23:57:46 | 显示全部楼层
回复【18楼】Mars_man:
---------------------------------
这里的问题关键不在于如何添加负号 , 而在于如何检测低于0V的信号 , 这个坛里有不少帖子 .

基本流程是 输入信号 -> ADC能够处理的信号 -> ADC值 -> 程序上表达的输入信号的值 .

其中第一个箭头是前端处理电路 , 可以搜索旧帖 .

第二个箭头就是ADC要实现的功能 .

第三个箭头是程序要处理的计算 , 和第一个箭头是反向的过程 .

得到数值后 , 要怎么存储是随便的事 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
发表于 2014-11-4 09:42:08 | 显示全部楼层
回复【19楼】shihantu:
---------------------------------
感谢shihantu先生的深夜解答!!
真心发现我找到组织了!这个论坛真的很好!
还有个问题就是如何把采集数据对应的采集时间也存下来呢?
我估计我缺的是前端处理电路部分,在论坛上找了找,学习了不少,再次感谢!!好人一生平安。。。
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2014-11-4 10:54:00 | 显示全部楼层
回复【20楼】Mars_man:
---------------------------------
首先要获得采集时间 , 到底是开机时间还是几月几号 .

其次是保存 , 既然知道itoa就好办 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
发表于 2014-11-4 11:00:39 | 显示全部楼层
回复【21楼】shihantu:
------------------------------
我一直在线等着呢,感谢。
我所说的采集时间主要用于matlab绘图要用到。故采集时间就是0.0023s,2.332123s,4.231232s等等之类的时间数据。
请问这些时间数据要如何采集并存储下来呢?希望您给个思考的方向,或是可以搜索的关键句子。
感谢
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2014-11-4 11:16:13 | 显示全部楼层
回复【22楼】Mars_man:
---------------------------------
matlab处理的话 , 建议减少单片机端的运算量 , 可以先将时间以整形保存 .

时间信息 , 如果是等时采样的话 , 采样顺序就是时间 . 不等时采样 , 建议开启一个定时器 , 在获取ADC的值时同时读取定时器的值 . 当然由于定时器位数有限 , 还要软件做溢出处理 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
发表于 2014-11-4 11:27:42 | 显示全部楼层
回复【23楼】shihantu:
---------------------------------
感谢感谢!
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2014-4-2
在线时间
23 小时
发表于 2014-11-11 19:30:44 | 显示全部楼层
回复【6楼】shihantu:
-------------------------
大哥你好!我也是个新手,,这个语句res = f_write(&file, &data, sizeof(data), &bw);//写入文件,,,&data能不能带个数组?
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2014-11-11 20:07:19 | 显示全部楼层
回复【25楼】巴哈德:
---------------------------------
什么叫做带个数组 ?

char data[10];
第二个参数传入的是指向写入数据的指针 , 指向数组的指针可以是数组标号data , 也可以是数组第一个数据的地址&data[0] , 这是C的基本语法 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2014-4-2
在线时间
23 小时
发表于 2014-11-11 20:47:25 | 显示全部楼层
回复【26楼】shihantu:
---------------------------------
是我写错了,但我明白了,,谢谢啦
回复 支持 反对

使用道具 举报

14

主题

225

帖子

3

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2014-7-8
在线时间
26 小时
发表于 2014-11-16 23:20:18 | 显示全部楼层
回复【16楼】Mars_man:
---------------------------------
简单的运放电路即可
回复 支持 反对

使用道具 举报

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2014-11-7
在线时间
0 小时
发表于 2014-12-3 08:40:25 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
你好,请问官网有具体的库函数吗?
回复 支持 反对

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-5-16
在线时间
0 小时
发表于 2015-6-21 17:05:08 | 显示全部楼层
好贴顶,细看了楼主的问题,我也遇到了。按照各位的指导,解决了
回复 支持 反对

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
发表于 2015-10-28 09:22:05 | 显示全部楼层
回复【6楼】shihantu:
---------------------------------
请教下:f_lseek函数的第二个参数如果为负值,该怎么实现呢?
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2015-10-28 13:35:12 | 显示全部楼层
FATFS 的 lseek 是绝对定位 , 除了 -1 在开启快速搜索时有意义外 , 其他负数都是非法 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2015-10-28 13:35:43 | 显示全部楼层
回复【31楼】bjtmh:
---------------------------------
FATFS 的 lseek 是绝对定位 , 除了 -1 在开启快速搜索时有意义外 , 其他负数都是非法 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-2-26
在线时间
5 小时
发表于 2016-2-26 10:57:26 | 显示全部楼层
shihantu 发表于 2015-10-28 13:35
回复【31楼】bjtmh:
---------------------------------
FATFS&nbsp;的&nbsp;lseek&nbsp;是绝对定位&nbsp;, ...

你好,最近把数据写到SD卡里的TXT文件里,发现其中有字符出现,而我存储的都是数字,一个星期啦,还没找到原因,我的存储数据在中断里执行。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-2-26
在线时间
5 小时
发表于 2016-2-26 11:06:47 | 显示全部楼层
shihantu 发表于 2015-10-28 13:35
回复【31楼】bjtmh:
---------------------------------
FATFS&nbsp;的&nbsp;lseek&nbsp;是绝对定位&nbsp;, ...

c:\picture
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2015-5-9
在线时间
11 小时
发表于 2016-7-27 15:14:21 | 显示全部楼层
不错的帖子,受益了
回复 支持 反对

使用道具 举报

14

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-5-16
在线时间
67 小时
发表于 2017-1-18 15:50:35 | 显示全部楼层
你写成txt格式不用把数据转换成ASCII吗?我是用f_printf后面跟一大堆数组。写的速度很慢,谁有什么好方法指导下我
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-6 18:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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