⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exam11.c

📁 使用CH375USB接口芯片创建长文件名
💻 C
📖 第 1 页 / 共 3 页
字号:
				if(pDirName->DIR_Attr==ATTR_LONG_NAME){pDirName++;continue;}		/*为长文件名,不分析*/
				for(i=0;i!=8;i++){									/*分析文件名是否相同*/
					if(pDirName->DIR_Name[i]==0x20)continue;		/*为20不分析*/        
					if(pDirName->DIR_Name[i]!=*pBuf)break;
					else pBuf++;
				}
				if(i!=8){pDirName++;continue;}						/*没有找到匹配的短文件名*/
				if(*pBuf=='.')pBuf++;
				for(;i!=11;i++){
					if(pDirName->DIR_Name[i]==0x20)continue;				
					if(pDirName->DIR_Name[i]!=*pBuf)break;		
					else pBuf++;
				}
				if(i==11){break;}								/*表示找到文件名*/
				pDirName++;
			}
			if(i==11)break;								/*找到*/
			if(a==1){k=16;break;}
		}
		if(k!=16){
				 x=0;      /*下面找短文件名然后删除*/
				 sum=ChkSum(pDirName); 					       /*计算和*/				
				 pLDirName=FBuf?FILE_DATA_BUF_ADDR:FILE_DATA_BUF_ADDR1;	/*长文件名指针指向缓冲区*/
				 pLDirName+=k-1;
				 if(k==0){pLDirName=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR;  /*如果短文件名是丛第一组开始的,长文件名就要往起移动*/
						pLDirName+=15;						
						k=15;					
					}
				while(1){	
					if((pLDirName->LDIR_Attr==0x0f)&(pLDirName->LDIR_Chksum==sum)&(pLDirName->LDIR_Ord!=0xe5)){
						pLDirName->LDIR_Ord=0xe5;				/*删除长文件名*/
				   		x++;
						k=k-1;
					}
					else break;							/*没有长文件名则条出*/
					if(x==15)break;						/*最大限制长文件名为16*13字节*/
					if(k==0){								/*首先移动文件指针*/					
						pLDirName=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR;
						pLDirName+=15;														
					}
					else {pLDirName-=1; k-=1;}
				}
					if(tempSec!=0){
						tempSec-=1;
						mCmdParam.Locate.mSectorOffset=(unsigned long)tempSec;		/*将分析过的目录项重新写入*/
						i=CH375FileLocate();
						if(i!=ERR_SUCCESS)goto XLL;	
						mCmdParam.ReadX.mSectorCount=1;
						mCmdParam.ReadX.mDataBuffer=FBuf?FILE_DATA_BUF_ADDR:FILE_DATA_BUF_ADDR1;
						i=CH375FileWriteX( );
						if(i!=ERR_SUCCESS)goto XLL;
					}
				if(tempSec!=0){
					tempSec-=1;
					mCmdParam.Locate.mSectorOffset=(unsigned long)tempSec;		/*将分析过的目录项重新写入*/
					i=CH375FileLocate();
					if(i!=ERR_SUCCESS)goto XLL;	
					mCmdParam.ReadX.mSectorCount=1;
					mCmdParam.ReadX.mDataBuffer=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR;
					i=CH375FileWriteX( );
					if(i!=ERR_SUCCESS)goto XLL;
				}
			}
	}		
	CH375DirtyBuffer(  );		
	i=CH375FileClose( );		
	CH375DirtyBuffer(  );						/*清磁盘缓冲区*/
	for(k=0;k!=MAX_PATH_LEN;k++)mCmdParam.Other.mBuffer[k]=ParData[k];			/**/	
	i=CH375FileErase( );
	return i;
XLL:  return i;								/*出错时,返回错误信息*/						
}

/*读取指定短文件名的长文件名,返回长文件名在长文件名空间*/
UINT8  mLookUpLName(){
	UINT8  BlockSer1;				/*定义两个扇区块内记数*/
	unsigned char xdata ParData[MAX_PATH_LEN];			/**/
	UINT16	tempSec;						/*扇区偏移*/
	UINT8 a,i,j,x,k,sum;
	F_LONG_NAME   xdata *pLDirName; 
	P_FAT_DIR_INFO  pDirName;
	bit  FBuf;
	unsigned char xdata *pBuf;
	unsigned int xdata *pBuf1;
	for(k=0;k!=MAX_PATH_LEN;k++)ParData[k]=mCmdParam.Other.mBuffer[k];			/**/
		i=mChkName(&j);	
	if ( i == ERR_SUCCESS ) {  /* 成功获取上级目录的起始簇号 */
		BlockSer1=0;
		FBuf=0;					/*初始化*/	
		tempSec=0;				
		while(1){							/*下面是读取并分析目录项*/
			pDirName=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR;		/*短文件名指针指向缓冲区*/		
			mCmdParam.ReadX.mSectorCount=1;				/*读取一扇区数据*/
			mCmdParam.ReadX.mDataBuffer=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR;  /*当前处理的文件缓冲区,这里使用双向缓冲区,去处理文件名*/
			FBuf=!FBuf;												/*缓冲区标志翻转*/
			i=CH375FileReadX( );
			if(i!=ERR_SUCCESS)goto XFF;
			if(mCmdParam.ReadX.mSectorCount==0){k=16;break;}			/*表示没有数据读出*/
			tempSec+=1;												/*扇区记数加一*/
			for(k=0;k!=16;k++){																	
				pBuf=&ParData[j+1];						
				if(pDirName->DIR_Name[i]==0){k=15;a=1;continue;}		/*第一个字节为0,表示以后没有有效的目录项了*/
				if(pDirName->DIR_Name[i]==0xe5){pDirName++;continue;}			/*第一个字节为0XE5表示此项被删除*/
				if(pDirName->DIR_Attr==ATTR_VOLUME_ID){pDirName++;continue;}		/*为卷标,不分析*/
				if(pDirName->DIR_Attr==ATTR_LONG_NAME){pDirName++;continue;}		/*为长文件名,不分析*/
				for(i=0;i!=8;i++){									/*分析文件名是否相同*/
				if(pDirName->DIR_Name[i]==0x20)continue;		/*为20不分析*/        
				if(pDirName->DIR_Name[i]!=*pBuf)break;
				else pBuf++;
			}
			if(i!=8){pDirName++;continue;}						/*没有找到匹配的短文件名*/
			if(*pBuf=='.')pBuf++;
			for(;i!=11;i++){
				if(pDirName->DIR_Name[i]==0x20)continue;				
				if(pDirName->DIR_Name[i]!=*pBuf)break;		
				else pBuf++;
			}
			if(i==11){break;}								/*表示找到文件名*/
			pDirName++;
			}
			if(i==11)break;								/*找到*/
			if(a==1){k=16;break;}
		}
		if(k!=16){
					pBuf1=LongFileName;
						 x=0;
				 sum=ChkSum(pDirName); 					       /*计算和*/				
				 pLDirName=FBuf?FILE_DATA_BUF_ADDR:FILE_DATA_BUF_ADDR1;	/*长文件名指针指向缓冲区*/
				 pLDirName+=k-1;
				 if(k==0){pLDirName=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR;  /*如果短文件名是丛第一组开始的,长文件名就要往起移动*/
						pLDirName+=15;						
						k=15;					
					}
				while(1){	
					if(pLDirName->LDIR_Attr==0x0f&pLDirName->LDIR_Chksum==sum&pLDirName->LDIR_Ord!=0xe5){
						for(j=0;j!=5;j++){	
						*pBuf1=pLDirName->LDIR_Name1[j];
						pBuf1++;
						}
						for(;j!=11;j++){	
						*pBuf1=pLDirName->LDIR_Name2[j-5];
						pBuf1++;
						}
							for(;j!=13;j++){	
						*pBuf1=pLDirName->LDIR_Name3[j-11];
						pBuf1++;
						}
						/*这里将长文件名复制出去,最大16*13个长文件名*/					
				   		x++;	 
					}
					else break;							/*没有长文件名则条出*/
					if(x==15)break;						/*最大限制长文件名为16*13字节*/
					if(k==0){						/*首先移动文件指针*/					
						pLDirName=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR;
						pLDirName+=15;														
					}
					else {pLDirName-=1; k-=1;}
				}
			}					
	}
	*pBuf1=0;
	pBuf1++;
	i=CH375FileClose( );	
	return 0;					
XFF:  return i;
}

main( ) {
	UINT8	i,k;
	UINT16 X;
	LED_OUT_INIT( );
	LED_OUT_ACT( );  /* 开机后LED亮一下以示工作 */
	mDelaymS( 100 );  /* 延时100毫秒 */
	LED_OUT_INACT( );
	mInitSTDIO( );  /* 为了让计算机通过串口监控演示过程 */
	printf( "Start\n" );
	i = CH375LibInit( );  /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
	mStopIfError( i );
/* 其它电路初始化 */

	while ( 1 ) {
	//	printf( "Wait Udisk\n" );
		while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘插入 */
		LED_OUT_ACT( );  /* LED亮 */
		mDelaymS( 200 );  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */

/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
		for ( i = 0; i < 5; i ++ ) {  /* 有的U盘总是返回未准备好,不过可以被忽略 */
			mDelaymS( 100 );
	//		printf( "Ready ?\n" );
			if ( CH375DiskReady( ) == ERR_SUCCESS ) break;  /* 查询磁盘是否准备好 */
		}
/* 查询磁盘物理容量 */
//		printf( "DiskSize\n" );
//		i = CH375DiskSize( );
//		mStopIfError( i );
//		printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) );  /* 显示为以MB为单位的容量 */
		LED_RUN_ACT( );  /* 开始操作U盘 */

		X=0X4100;
		for(k=0;k!=0x0F;k++){		/*演示创建长文件名*/
			mCmdParam.Erase.mPathName[0]='/';   /*给出参考短文件名*/
			mCmdParam.Erase.mPathName[1]='C';
			mCmdParam.Erase.mPathName[2]='/';
			mCmdParam.Erase.mPathName[3]='A';
			mCmdParam.Erase.mPathName[4]='B';
			mCmdParam.Erase.mPathName[5]='C';
			mCmdParam.Erase.mPathName[6]='D';		
			mCmdParam.Erase.mPathName[7]='A';
			mCmdParam.Erase.mPathName[8]='~';
			mCmdParam.Erase.mPathName[9]='1';
			mCmdParam.Erase.mPathName[10]='2';
			mCmdParam.Erase.mPathName[11]='.';
			mCmdParam.Erase.mPathName[12]='C';
			mCmdParam.Erase.mPathName[13]=00;
			LongFileName[0]=0X4100;					/*给出UNICODE的长文件名*/						
			LongFileName[1]=0X4200;    /* 对于小端数据格式的单片机,例如AVR/MSP430/ARM等是0x0042,下同 */
			LongFileName[2]=0X4300;
			LongFileName[3]=0X4400;
			LongFileName[4]=0X4500;
			LongFileName[5]=0X4600;
			LongFileName[6]=0X4700;
			LongFileName[7]=0X4800;
			LongFileName[8]=0X4100;
			LongFileName[9]=0X6300;
			LongFileName[10]=0X6200;
			LongFileName[11]=0X6100;
			LongFileName[12]=X;
			LongFileName[13]=X;
			LongFileName[14]=0X2e00;
			LongFileName[15]=0X4300;
			LongFileName[16]=0X0000;
	
			i=mCreatLName();				/*创建长文件名*/			
		X+=0X100;
	}

		X=0X4100;
		for(k=0;k!=0x0F;k++){		/*演示创建长文件名*/
		mCmdParam.Erase.mPathName[0]='/';   /*给出参考短文件名*/
		mCmdParam.Erase.mPathName[1]='A';
		mCmdParam.Erase.mPathName[2]='B';
		mCmdParam.Erase.mPathName[3]='C';
		mCmdParam.Erase.mPathName[4]='D';		
		mCmdParam.Erase.mPathName[5]='A';
		mCmdParam.Erase.mPathName[6]='~';
		mCmdParam.Erase.mPathName[7]='1';
		mCmdParam.Erase.mPathName[8]='1';
		mCmdParam.Erase.mPathName[9]='.';
		mCmdParam.Erase.mPathName[10]='C';
		mCmdParam.Erase.mPathName[11]=00;

		LongFileName[0]=0X6100;					/*给出UNICODE的长文件名*/						
		LongFileName[1]=0X4200;
		LongFileName[2]=0X6300;
		LongFileName[3]=0X4400;
		LongFileName[4]=0X4500;
		LongFileName[5]=0X6500;
		LongFileName[6]=0X4700;
		LongFileName[7]=0X4800;
		LongFileName[8]=0X4100;
		LongFileName[9]=0X6300;
		LongFileName[10]=0X6200;
		LongFileName[11]=0X6100;
		LongFileName[12]=X;
		LongFileName[13]=X;
		LongFileName[14]=0X2e00;
		LongFileName[15]=0X4300;
		LongFileName[16]=0X0000;
	
			i=mCreatLName();				/*创建长文件名*/			
		X+=0X100;
	}
	X=0X4100;

for(k=0;k!=0x4;k++){	    /*查找并删除*/
		mCmdParam.Erase.mPathName[0]='/';		/*给出路径*/
		mCmdParam.Erase.mPathName[1]='C';
		mCmdParam.Erase.mPathName[2]='/';
		mCmdParam.Erase.mPathName[3]=00;
		LongFileName[0]=0X4100;				/*给出长文件名*/					
		LongFileName[1]=0X4200;
		LongFileName[2]=0X4300;
		LongFileName[3]=0X4400;
		LongFileName[4]=0X4500;
		LongFileName[5]=0X4600;
		LongFileName[6]=0X4700;
		LongFileName[7]=0X4800;
		LongFileName[8]=0X4100;
		LongFileName[9]=0X6300;
		LongFileName[10]=0X6200;
		LongFileName[11]=0X6100;
		LongFileName[12]=X;
		LongFileName[13]=X;
		LongFileName[14]=0X2e00;
		LongFileName[15]=0X4300;
		LongFileName[16]=0X0000;

		i=mLoopkUpSName();			/*查找短文件名*/
		i=mdeleteFile();			/*删除文件*/	
		X+=0X100;
	}

		X=0;
	while(1)
	{	
		mCmdParam.Erase.mPathName[0]='/';		/*给出路径*/
		mCmdParam.Erase.mPathName[1]='C';
		mCmdParam.Erase.mPathName[2]='/';
		mCmdParam.Erase.mPathName[3]='*';
		mCmdParam.Erase.mPathName[4]=X;
		mCmdParam.Erase.mPathName[5]=00;
		mCmdParam.Erase.mPathName[6]=00;
		i=CH375FileOpen();
		if ( i == ERR_MISS_FILE ) break;  /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
		if ( i == ERR_FOUND_NAME ) {  /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
		   i=mLookUpLName();		/*搜索对应的长文件名*/
		 }
		X++;
		if(X==0xfE)break;
	}		
		LED_WR_INACT( );
		LED_RUN_INACT( );
		printf( "Take out\n" );
		while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘拔出 */
		LED_OUT_INACT( );  /* LED灭 */
		mDelaymS( 200 );
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -