这个是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 编辑 ]
此帖出自
小平头技术问答
bmp图片不能看到!
请下载到本地再上传!
一周热门 更多>