stm32+sd卡+fatfs0.08文件系统,图片的数据读取不对。。请大侠们支个招。。

2019-03-23 19:52发布

  这个是bmp图片的数据;   我现在用文件系统读取前面八个字节的数据,老读不出来,读取的数据总是2000073c(16进制); 图片文件直接在sd卡下面,读取一个名叫,qin.bmp 的图片文件     以下是我的部分代码;   void file_system_test(void)
{  
       /* FatFs function common result code */
   
 int n=1;  //定义文件的数量
    char *result1, *result2;  //指针存放的后缀名
    char EXT1[4]=".bmp";    //定义文件的后缀
    char EXT2[4]=".BMP";
#if _USE_LFN
static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];
finfo.lfname = lfn;
finfo.lfsize = sizeof(lfn);
#endif
 
 printf("开始BMP图像的显示!");  disk_initialize(0);
 f_mount(0, &fs);  if (f_opendir(&dirs, "") == FR_OK)  //读取sd卡下面的文件,注意这个是没有文件夹的,直接打开sd卡就能看见
 {
   while (f_readdir(&dirs, &finfo) == FR_OK)    //循环依次读取文件名
   { 
       if (finfo.fattrib & AM_ARC)
     {
         if(!finfo.fname[0])  break;
    if(finfo.lfname[0])  //长文件名
    {
      printf(" 文件%d是: %s ", n, finfo.lfname);
                  result1=strstr(finfo.lfname,EXT1);  /* 小写的后缀名 */
      result2=strstr(finfo.lfname,EXT2);  /* 大写的后缀名 */
    }
     else     //8.3格式文件名
     {                                
       printf(" 文件%d是: %s ", n, finfo.fname); 
                   result1=strstr(finfo.lfname, EXT1);  /* 小写的后缀名,找字符串;成功,返回地址的值,否则,返回0*/
       result2=strstr(finfo.lfname, EXT2);  /* 大写的后缀名,找字符串;成功,返回地址的值,否则,返回0*/
     }
      n++; //文件的数量
   }
      
     }
  //开始读取文件的数据
  //br=1;
     //if(result1!=NULL||result2!=NULL){
 /// if(1){
  // res = f_readdir(&dirs, &finfo);           //如果不是空的地址
         if(finfo.lfname[0]){
       printf("tupianshi:%s", finfo.lfname);         //长文件名  
    res = f_open(&fbmp, "qin.bmp", FA_OPEN_EXISTING | FA_READ);//以读的方式打开文件
   }
   else{
    printf(" tupianshi1111:%s ", finfo.fname);                   //8.3格式文件名
    res = f_open(&fbmp, "qin.bmp",  FA_OPEN_EXISTING | FA_READ); //以读的方式打开文件
   }
 // }
    // while(1){   //读取图片
     res = f_read(&fbmp, buffer, sizeof(buffer), &br);
     //for(j=0;j<512;j++)
     //{
     printf(" %x",buffer);   //试着读取缓冲区的数据 ~~~~~~~~~~~这个地方读取的数据要和图片的数据一样,可是读取出来的都不一样,老是一个数值
     //i++;
    // }
    // if (res || br == 0) break;
  //   };
     f_close(&fbmp);
  } f_mount(0, NULL);// Unregister a work area before discard it }   diskio.c中的读取块的子函数是: DRESULT disk_read (
 BYTE drv,  /* Physical drive nmuber (0..) */
 BYTE *buff,  /* Data buffer to store read data */
 DWORD sector, /* Sector address (LBA) */
 BYTE count  /* Number of sectors to read (1..255) */
)
{
 if (count > 1)
 {
  SD_ReadMultiBlocks(buff, sector*BLOCK_SIZE, BLOCK_SIZE, count); //扇区地址*512就是实际地址 默认一个扇区就是512个字节
 }
 else
 {
  SD_ReadBlock(buff, sector<<9, BLOCK_SIZE);
 }
 return RES_OK; // if(count==1)
//    {
//          SD_ReadBlock((u8 *)(&buff[0]),sector << 9 ,SECTOR_SIZE);
//        
// }
// return RES_OK;
}   主函数:
int main(void)
{
  USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   STM_EVAL_COMInit(COM1, &USART_InitStructure);
  NVIC_Configuration();   printf(" ************************************ ");   STM_EVAL_LEDInit(LED1);
  STM_EVAL_LEDInit(LED2);
  STM_EVAL_LEDInit(LED3);
  STM_EVAL_LEDInit(LED4);
 
  STM3210E_LCD_8347_Init();
 
  Status = SD_Init();
  if (Status == SD_OK)
   {
  Status = SD_GetCardInfo(&SDCardInfo);
   printf(" SD卡的总容量:%d MB ", (SDCardInfo.CardCapacity >>20));
  //printf(" SD卡已经使用容量:%d MB ", (SDCardInfo.CardCapacity >>20));
  //printf(" SD卡的剩余容量是:%d MB ", (SDCardInfo.CardCapacity >>20));    }
   file_system_test();   while (1)
  {
  }
 
}   这个是运行的结果:
 ************************************
 
SD卡的总容量:942 MB
 开始BMP图像的显示!
 文件1是:
qinsong.txt  文件2是:
a2.txt  文件3是:
dstfile.txt  文件4是:
aa.JPG  文件5是:
qin.bmp tupianshi1111: 2000073c   [ 本帖最后由 qinsong 于 2012-5-30 11:06 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。