OpenEdv-开源电子网

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

字符数组在fatfs里的f_read 赋值出现这种情况

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-4-16 16:53:59 | 显示全部楼层 |阅读模式
从f_read 赋值里 把buffer赋值给zijitext后, 在关闭201205.TXT里能够通过超级终端显示hello,之后在主函数里就不能显示,求解。

#include "stm32f10x.h"
#include "usart1.h"
#include "sdcard.h"
#include "ff.h"
#include "diskio.h"

#include <string.h>


/* 变量定义 */
SD_CardInfo SDCardInfo;    /* 存放SD卡的信息 */        


FATFS fs[2];            // Work area (file system object) for logical drive
FIL fsrc, fdst;         // file objects
BYTE buffer[512];       // file copy buffer
int a = 0;
FRESULT res;            // FatFs function common result code
UINT br, bw;            // File R/W count
char path[512]="0:";    
uint8_t textFileBuffer[] = "20120416";
uint8_t metext[]="hello";
char zijitext[20];

/* 函数声明 */
void NVIC_Configuration(void);
SD_Error SD_USER_Init(void);
void OutPutFile(void);
FRESULT scan_files (char* path);
int SD_TotalSize(void);

int main(void)
{        
   
        SystemInit();/* config the sysclock to 72M */
        USART1_Config(); /* USART1 config */
        NVIC_Configuration();        /* Interrupt Config */
        
        disk_initialize( 0 );             /* SD 卡硬件初始化,非常重要 */
        

/*--------------- 在SD卡里面创建一个文件并将缓冲区的内容写到文件中 ---------------*/
        /* 在文件系统中注册一个工作区 */ 
        f_mount(0, &fs[0]);                                                           
        res = f_open( &fsrc , "0:/201204.TXT" , FA_OPEN_ALWAYS | FA_WRITE); /* 在刚刚注册的工作区中打开一个文件,如果文件不存在则创建该文件,属性为可写 */
        res = f_write(&fsrc, textFileBuffer, sizeof(textFileBuffer), &br);         /* 将缓冲区的数据写到文件中 */
    f_close(&fsrc);        /*关闭文件 */

        res = f_open(&fsrc, "0:/201204.TXT", FA_OPEN_EXISTING | FA_READ); /* 打开文件 */                
        br = 1;
        a = 0;        
    for (;;) 
        {
                for ( a=0; a<512; a++ )                                   /* 清缓冲区 */
                        buffer[a]=0;
                  res = f_read( &fsrc, buffer, sizeof(buffer), &br ); /* 将文件里面的内容读到缓冲区 */
                printf("\r\n %s ", buffer);                                                
              if (res || br == 0) break;                          /* 错误或者到了文件尾 */                            
    }
        f_close(&fsrc);                                              /* 关闭打开的文件 */        
        
//  写201205.txt
        res = f_open( &fsrc , "0:/201205.TXT" , FA_OPEN_ALWAYS | FA_WRITE);
        res = f_lseek(&fsrc , 0); 
        res = f_write(&fsrc, metext, sizeof(metext), &br); 
        f_close(&fsrc); 

        res = f_open(&fsrc, "0:/201205.TXT", FA_OPEN_EXISTING | FA_READ); /* 打开文件 */                
        br = 1;
        a = 0;        
    for (;;) 
        {
                for ( a=0; a<512; a++ )                                   /* 清缓冲区 */
                        buffer[a]=0;
                  res = f_read( &fsrc, buffer, sizeof(buffer), &br ); /* 将文件里面的内容读到缓冲区 */
                for(a=0;a<20;a++)
                zijitext[a] = buffer[a];                
                printf("\r\n %s ", zijitext);                        ///通过超级终端可以显示hello        
              if (res || br == 0) break;                          /* 错误或者到了文件尾 */                            
    }
        f_close(&fsrc);                                              /* 关闭打开的文件 */        

        printf("\r\n %s ", zijitext);         ///这一语句在超级终端不显示hello
        

    while (1)
    {      
    }






SD_Error SD_USER_Init(void)
{
        SD_Error Status = SD_OK;

        /* SD Init */
  Status = SD_Init();

  if (Status == SD_OK)
  {
    /* Read CSD/CID MSD registers */
   Status = SD_GetCardInfo( &SDCardInfo );
  }
  
  if (Status == SD_OK)
  {
    /* Select Card */
    Status = SD_SelectDeselect( (u32) (SDCardInfo.RCA << 16) );
  }
  
  if (Status == SD_OK)
  {
          /* set bus wide */
    Status = SD_EnableWideBusOperation( SDIO_BusWide_1b );
  }
  
  /* Set Device Transfer Mode to DMA */
  if (Status == SD_OK)
  { 
          /* 任选一种都可以工作 */ 
    Status = SD_SetDeviceMode( SD_DMA_MODE );
    //Status = SD_SetDeviceMode( SD_POLLING_MODE );
    //Status = SD_SetDeviceMode( SD_INTERRUPT_MODE );        
  }
        return ( Status );
}


void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Configure the NVIC Preemption Priority Bits */

  NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-4-16 18:05:12 | 显示全部楼层
用jtag仿真一下就知道原因了.
我初步估计是你的for循环执行了2次,第二次printf的时候已经没有内容了.所以出来的时候,你的printf也是无内容的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
883
金钱
883
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-9-11 16:38:45 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥估计正确了。。厉害
很喜爱电子行业
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 19:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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