OpenEdv-开源电子网

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

FATFS文件系统,读出的数据不正确.

[复制链接]

9

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-10-29
在线时间
2 小时
发表于 2014-11-16 22:32:23 | 显示全部楼层 |阅读模式
5金钱
本人小白,在学习stm32的时候遇到问题,希望高手们能帮我分析一下。
我用FATFS文件系统读取SD卡上的文件,读出的数据长度不正确,并且错乱。
具体情况:使用战舰开发板,SD卡实验例程,读取SD卡根目录下的a.txt文档(文档内容只有一个数字“1”),然后用USART1把数据传回,传回的数据前几个字节是错误的,长度也超出设定的512字节。
代码如下:
void OutPutFile(void)

    unsigned int a;
    FILINFO finfo;
    DIR dirs;
    char path[15]={""}; //文件夹名,为空表示是根目录
    FRESULT res;
    FIL fsrc;
    u8 buffer[512];

    if(f_opendir(&dirs,path) == FR_OK) //读取该磁盘的根目录或指定文件夹
    {     
       while(f_readdir(&dirs, &finfo) == FR_OK)//循环依次读取文件名
       {  
          if(!finfo.fname[0]) break; //如果是文件名为空表示到目录的末尾,退出                   
          if(finfo.fattrib & AM_ARC)//判断文件属性是否为存档型 TXT文件一般都为存档型
         {
            res = f_open(&fsrc, finfo.fname, FA_OPEN_EXISTING | FA_READ);// 以读的方式打开文件
            br=1;//读取的次数(一次读出512字节),最大512次
            for (;;) 
            {                     
                for(a=0; a<512; a++) buffer[a]=0; 
                res = f_read(&fsrc,buffer,512, &br);//从a1.txt,一次读出512字节
                for(a=0; a<512; a++)
                {
                    printf("%x",buffer[a]);//%c
                    //USART_SendData(USART1,buffer[a]);//使用串口1发送回PC
                    //while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); 
                } 
                if(res || br == 0) break;   // 错误或结束,退出
            }
            f_close(&fsrc); //关闭文档                                                                                                
          }
        } 
     } 
}

int main(void)
{  
  delay_init();    
  NVIC_Configuration();
  uart_init(115200);

  exfuns_init();
  mem_init(SRAMIN); 
  while(SD_Initialize())
  f_mount(0,fs[0]);  
  OutPutFile();

  while(1)
  {   
  } 
}



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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-16 22:55:32 | 显示全部楼层
FILINFO finfo;
    DIR dirs;
    char path[15]={""}; //文件夹名,为空表示是根目录
    FRESULT res;
    FIL fsrc;
    u8 buffer[512];

局部变量太多,估计你的代码没死机算是万幸了。
把大数组放外面去!!!再测试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-10-29
在线时间
2 小时
 楼主| 发表于 2014-11-16 23:54:10 | 显示全部楼层
 回复【2楼】 正点原子 :
---------------------------------
谢谢原子哥这么晚还回复我,我根据你的意思修改后再测试了一下。
我把数组变为全局变量和减少数组长度,其他不变,接收的数据还是有问题(前几个字节的数据错误,数据长度变成两倍)




回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-17 20:37:55 | 显示全部楼层
回复【3楼】hfd999:
---------------------------------
这得再看看代码了。我也不知道为啥,你看看fatfs函数操作后的返回值正常不?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 03:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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