stm32+sd卡+fatfs0.08文件系统,图片的数据读取不对。。请大侠们支个招。。
[复制链接]
这个是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("\r\n 文件%d是:\n%s\n", n, finfo.lfname); result1=strstr(finfo.lfname,EXT1); /* 小写的后缀名 */ result2=strstr(finfo.lfname,EXT2); /* 大写的后缀名 */ } else //8.3格式文件名 { printf("\r\n 文件%d是:\n%s\n", 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("\r\ntupianshi1111:%s\r\n", 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("\r\n%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("\n\r ************************************ \r\n ");
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("\n\rSD卡的总容量:%d MB \r\n ", (SDCardInfo.CardCapacity >>20)); //printf("\n\r SD卡已经使用容量:%d MB \r\n ", (SDCardInfo.CardCapacity >>20)); //printf("\n\r SD卡的剩余容量是:%d MB \r\n ", (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 编辑 ]
|