OpenEdv-开源电子网

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

FATFS用f_read读取BMP文件只读了2次就出错了返回了

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-9-1
在线时间
0 小时
发表于 2014-9-1 13:42:52 | 显示全部楼层 |阅读模式
5金钱
我用其他的屏幕做图像显示,所以在原子哥原有的例程上进行了修改,将原有的LCD相关的都去掉了,BMP解码文件也做了相应的修改(只解码单色文件)。但是在文件读取解码显示的时候出现了问题,文件的打开,第一次读取和第二次读取都很正常,但是第三次读取的时候出现了奇怪的现象,f_read返回了9,就是Id不等。经过我仔细追查发现f_bmp->fs整个的值都发生了改变fs_type由2变成了112,drv更是又0变成了133,所有的值都是错误的所以validate(fs)的时候就返回了9。为了检查错误我特地将解码文件改成如下,去掉了解码显示部分,只有读取部分。求原子哥帮忙查找下错误原因啊!
[mw_shl_code=c,true]u8 stdbmp_decode(const u8 *filename,u8 frame) { FIL* f_bmp; u16 br; u16 count; u8 cor=0; u8 rgb ,color_byte; u16 x ,y; u8 color; u16 col=0; u16 countpix=0;//记录像素 u8 res; u16 temp[4]; u8 nowbit; u8 bitcolor; u8 tempbit; //u8 data[256]; u8 butto[16]={0xaa,0xa9,0xa6,0xa5,0x9a,0x99,0x96,0x95,0x6a,0x69,0x66,0x65,0x5a,0x59,0x56,0x55}; u8 *databuf; //数据读取存放地址 u16 readlen=BMP_DBUF_SIZE;//一次从SD卡读取的字节数长度 u8 *bmpbuf; //数据解码地址 u8 biCompression=0; //记录压缩方式 u16 rowlen; //水平方向字节数 BITMAPINFO *pbmp; //临时指针 #if BMP_USE_MALLOC == 1 //使用malloc databuf=(u8*)mymalloc(readlen); //开辟readlen字节的内存区域 //data=(u8*)mymalloc(256); if(databuf==NULL)return PIC_MEM_ERR; //内存申请失败. f_bmp=(FIL *)mymalloc(sizeof(FIL)); //开辟FIL字节的内存区域 if(f_bmp==NULL) //内存申请失败. { myfree(databuf); return PIC_MEM_ERR; } #else //不使用malloc //databuf=bmpreadbuf; //f_bmp=&f_bfile; #endif res=f_open(f_bmp,(const TCHAR*)filename,FA_READ);//打开文件 if(res==0)//打开成功. { f_read(f_bmp,databuf,readlen,(UINT *)&br);//读出readlen个字节 pbmp=(BITMAPINFO *)databuf;//得到BMP的头部信息 count=pbmp->bmfHeader.bfOffBits; //数据偏移,得到数据段的开始地址 color_byte=pbmp->bmiHeader.biBitCount/8; //彩色位 16/24/32 cor=pbmp->bmiHeader.biBitCount; biCompression=pbmp->bmiHeader.biCompression;//压缩方式 picinfo.ImgHeight=pbmp->bmiHeader.biHeight; //得到图片高度 picinfo.ImgWidth=pbmp->bmiHeader.biWidth; //得到图片宽度 //ai_draw_init();//初始化智能画图 //水平像素必须是4的倍数!! //rowlen=256; if(cor==1) {rowlen=256; } else { if((picinfo.ImgWidth*color_byte)%4)rowlen=((picinfo.ImgWidth*color_byte)/4+1)*4; else rowlen=picinfo.ImgWidth*color_byte; } //开始解码BMP color=0;//颜色清空 x=0 ; y=picinfo.ImgHeight; rgb=0; bmpbuf=databuf; while(1) { if(cor>1) { } else { res=f_read(f_bmp,databuf,readlen,(UINT *)&br); if(br!=readlen){readlen=br;}//最后一批数据 if(res||br==0)break; //读取出错 bmpbuf=databuf; count=0; } f_close(f_bmp);//关闭文件 } } #if BMP_USE_MALLOC == 1 //使用malloc myfree(databuf); myfree(f_bmp); #endif return res; //BMP显示结束. } [/mw_shl_code]

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-1 22:58:07 | 显示全部楼层
你别改我们的代码测试下先,看看可否正常。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 13:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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