初学Fatfs系统,利用单片机合并bin文件

最近在搞"有屏幕的地方就有badapple", Badapple驱动起来没什么问题,整体的思路就是SD(硬件SPI)+Fatfs+OLED(模拟SPI)。。。。

在OLED屏幕播放badapple的过程其实就是在给OLED不断的刷图。。

     给OLED刷图的方法其实就是刷bin文件。我用Img2LCD这个软件,把BMP图像转化为二进制文件。

这个软件是很好用,每一帧的画面是128*64,一共是128*64=8192个位(像素点)=1024字节,每一帧就是一个画面,一个画面就是一个bin文件,这个软件转换出来的。

OK,问题来了,假如我播放的视频,一共有1万帧,那么岂不是有1万个bin文件,Oh my god...

我参考了别人的做法,是把这些bin文件合拼成一个大的bin文件,然后通过读,读完之后文件指针向后移动1024个字节,直到bin文件播放完毕。

好阿,那么我怎么才能把这1万个文件合并呢。有一个工具叫做Ubin...但是我下了一个版本,最多只能放100个bin文件、、、、

还有另外的大神做法是用Qt,Visual C,C++等在电脑编写一个程序,或者脚本之类的,把这些文件合并,可是我不会呀。。。不会就真的是没有办法了吗??

不要忘了还有Fatfs,其实做法也就是打开目录,新建文件,打开文件,写文件

那么我就直接上吧

#define filepath03 "0:/bad300" 
#define filepath08  "0:/bad300/NEW.bin"  

void Myscan_files_and_bin_to_bin(const char *path)//遍历文件,顺便把目录下的文件全部合并
{
	FRESULT res; //定义通用结果对象
	DIR dir; //定义目录对象
	FILINFO fno;//定义一个文件状态的结构体
	FIL fil,fnew;//定义一个文件结构体,用于等一下打开读取文件。,fnew是准备写入的文件
	u32 bww,bwn;
  u16 file_counter=0;
  unsigned char data_buff[1024]; 	
		if(f_opendir(&dir,path) == FR_OK) //打开目录
		{
				printf("->%s\n",path);				
        res=f_chdir(path);     //把文件夹指针移动至"path"目录下,这个我就不太明白,我看别人的不需要移动,但是我必须得移动文件夹指针才能访问目录,要不然路径不对!!!		 //#define _FS_RPATH	需要被定义为1的时候才能使用    
        if(f_open(&fnew,filepath08,FA_WRITE|FA_CREATE_ALWAYS) == FR_OK)		//创建要写入的bin文件	
				{
					printf("Create new.bin sucessed\n");				
				}
				else printf("Create new.bin fail\n");			
		}		
		else printf("Open path err!\n");			
		while(f_readdir(&dir,&fno) == FR_OK)  //自动遍历所有文件
		{
			  if(!fno.fname[0]) break; //读到文件末端,退出 
			  if(fno.fattrib == AM_ARC)//如果文件只有存到属性,那么这个是文件
				{
					 file_counter++;
			     printf("%d: %s \n",file_counter,fno.fname);  //输出这个文件名										
					 if(f_open(&fil,fno.fname,FA_READ) == FR_OK)  //如果打开文件成功
					 {
						  f_read(&fil,data_buff,1024,&bww);  //把这个文件读取到data_buff中
						  if(f_write(&fnew,data_buff,1024,&bwn) == FR_OK)
							{
								printf("write OK num:%d\n",file_counter);
							}	
						  f_close(&fil);
					 }			
				}										
		}
		f_close(&fnew); //全部完成,关闭新建立的文件,如果在合并bin文件的过程中断电,这时候SD卡会出错,需要重新格式化SD卡
		printf("write Done\n");
}

串口终端显示。。完成

但是有个问题,这样子来的话,看下第一个文件

12296.bin,,程序在把这个文件当做第一帧给写进去NEW.bin了,后面的顺序全部都正确。(我只合并了2297帧,第一个文件名是1000.bin)

我用的是这个函数 f_readdir,参考到别人做的遍历也是这样子做,所以对于排序的问题上,还是不够严谨。。。

然后来第二个问题,一开始在做合并的时候速度比较快,1秒可以合并20个文件,这样,可是,到后面,速度越来越慢了,到第2000个文件的时候,估计1秒只能合并1个文件了,

这个问题的话,目前我搞不懂,不知道是不是频繁的遍历文档,导致SD卡速度变慢了。。。

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值