OpenEdv-开源电子网

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

关于Fatfs f_write使用问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2015-4-18
在线时间
0 小时
发表于 2015-4-18 19:43:31 | 显示全部楼层 |阅读模式
5金钱
unsigned char buff[1024];
我定义这样一个缓冲区,然后我通过两路CAN接收几十个节点的数据,都存放到buff[]中,然后通过f_write写入SD卡,每隔一段时间存一次,但是我需要把每次接收到的数据用回车换行符隔开,以便存储后每一条CAN数据占一行。
     我的第一个问题是:在buff中写入什么,存到SD卡中会是回车换行。
     我的第二个问题是:我收到的都是16进制数据,怎么写入buff,才能使存到SD卡后0x01是01二不是1,以便正确区分写入的每一个16进制数。
由于数据量大,不能使用sprintf进行格式化。希望各位大神提供解决方法!

最佳答案

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

1,请百度:回车换行符。 2,用sprintf是最好的方法,如果不行,那就自己去写一个函数实现,比如十六进制的0X01,要变为数字1,那就是0X01+’0‘。不过前面的0,却要你自己添加了,1个字节变成2个字节了,你这个用sprintf还是来的爽快一点,不然自己写个函数凑合用,也行。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-18 19:43:32 | 显示全部楼层
1,请百度:回车换行符。
2,用sprintf是最好的方法,如果不行,那就自己去写一个函数实现,比如十六进制的0X01,要变为数字1,那就是0X01+’0‘。不过前面的0,却要你自己添加了,1个字节变成2个字节了,你这个用sprintf还是来的爽快一点,不然自己写个函数凑合用,也行。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2015-4-18
在线时间
0 小时
 楼主| 发表于 2015-4-21 08:10:21 | 显示全部楼层
谢谢,写一个转换函数把一个字节变两个字节就可以了
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-5-16
在线时间
0 小时
发表于 2015-6-20 17:29:16 | 显示全部楼层
我也遇到楼主的第一个问题,楼主解决了吗?能告诉我一下吗,菜鸟求教
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-5-16
在线时间
0 小时
发表于 2015-6-21 15:58:12 | 显示全部楼层
--------------------------回复【2楼】正点原子:
---------------------------------
原子哥,本人菜鸟,想知道我在用f_write 存数据到sd卡,很多组,为什么每次都只显示后面组的数据,前面组的都没有?有人说用换行,但是不知道我用对了没有,好像没有用。我的代码
   if(Y) //这是我自己设的标志,每次按下按键后Y为1,然后记录一次
{
sprintf(distance_str, "%5d %5d %5d %5d\r\n", H,h,C,t);//在这里换行吗???
       res=f_open(&file,"/count.txt",FA_OPEN_ALWAYS); 
   if(res==FR_OK)
 {
 f_open(&file, "/count.txt", FA_WRITE | FA_CREATE_ALWAYS);
  {
f_lseek(&file,200);
res=f_write(&file, distance_str, sizeof(distance_str),&bw);
}
  f_close(&file);
 }
  }  
我弄了一天了还是不会,希望原子哥帮助一下,谢谢了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-21 23:26:51 | 显示全部楼层
回复【5楼】铜牌之路:
---------------------------------
你这样代码本身就有问题。
f_lseek(&file,200);,每次都是在200字节处写数据,永远不停的覆盖,当然前面的数据就没了了。
改为:
f_lseek(&file,file.fsize);就可以了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-5-16
在线时间
0 小时
发表于 2015-6-23 15:45:37 | 显示全部楼层
谢谢原子哥  问题已经解决
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 18:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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