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

📄 fatprocess.c

📁 单片机读写U盘源码 基于51单片机和国产USB芯片CH374
💻 C
📖 第 1 页 / 共 3 页
字号:
		             bytes += files[ i ].wr.write.extra ;
		             files[ i ].wr.write.extra = bytes - ( bytes >> FAT.shift << FAT.shift ) ;   
          }
     }
     else
          writesectors = WriteNums >> FAT.shift ;
     
     //初始化写入起始扇区数
     ProcessSector = files[ i ].EndSector ;
     
     #ifdef  DEBUG_WRITE
     printf( "FILEBUF中这次读取的零头数据为 : %d\n", bytes ) ;
     printf( "现在FILEBUF中的零头数据为: %d\n", files[ i ].wr.write.extra ) ;
     printf( "本次要写入的扇区数: %d\n", ( UINT16 )writesectors ) ;
     printf( "本次要写入的起始扇区号: %ld\n", ProcessSector ) ;
     #endif
     
     //判断越界
     if ( files[ i ].wr.write.WritedSectors + writesectors > FAT.SecPerClus )
     {
          //调试语句
          #ifdef  DEBUG_WRITE 
          printf( " 数据越界 ! \n " ) ;
          #endif
          
          TransNum = FAT.SecPerClus - files[ i ].wr.write.WritedSectors ;
          s = mWriteSector( ProcessSector, TransNum, FILEBUF );
		        if ( s != USB_INT_SUCCESS )
		             return( ERR_Write ) ;
		        TransBytes = TransNum << FAT.shift ;
          TransNum = writesectors - TransNum ;
          
          //调试语句
          #ifdef  DEBUG_WRITE
          printf( "越界时第一次传输的字节数 : %d\n ", TransBytes ) ;
		        #endif
		        
		        //越界的数据写入另一个空白簇
		        //注意此时前一数据已写入,但是FAT表未更新
		        Cluster = x16CheckClus( ) ;
          if ( Cluster == 0x00 )
               return( ERR_FullDisk ) ;
          else  if ( Cluster == ERR_CheckClus )
               return( ERR_CheckClus ) ;
          //调试语句
          #ifdef  DEBUG_WRITE
          printf( " 找到的新的可写簇号为: %d\n " , Cluster ) ;
		        #endif
		        
		        //更新FAT表
		        s = x16List( files[ i ].clus.fat16.EndClus, Cluster, ModeZ1 ) ;
          if( s != ListSuccess )
               return( s ) ;
          files[ i ].clus.fat16.EndClus = Cluster ;
          s = x16List( files[ i ].clus.fat16.EndClus, 0xFFFF, ModeZ1 ) ;
          if( s != ListSuccess )
               return( s ) ;
          files[ i ].EndSector = ( ( files[ i ].clus.fat16.EndClus - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ;
          //写入剩余的数据
		        s = mWriteSector( files[ i ].EndSector, TransNum, FILEBUF + TransBytes );
		        if ( s != USB_INT_SUCCESS )
		             return( ERR_Write ) ;
		       files[ i ].EndSector += TransNum ;
		       files[ i ].wr.write.WritedSectors = TransNum ;
		   }
		   else  
		   {
		        //调试语句
          #ifdef  DEBUG_WRITE 
          printf( " 本次数据传输不越界 ! \n " ) ;
          #endif

		        TransNum = writesectors ;
          s = mWriteSector( ProcessSector, TransNum, FILEBUF );
		        if ( s != USB_INT_SUCCESS )
		             return( ERR_Write ) ;
          
          //更新FAT表
          s = x16List( files[ i ].clus.fat16.EndClus, 0xFFFF, ModeZ1 ) ;
          if( s != ListSuccess )
               return( s ) ;
          files[ i ].EndSector += TransNum ;
          files[ i ].wr.write.WritedSectors += TransNum ;
          if ( files[ i ].wr.write.WritedSectors >= FAT.SecPerClus )
          {
               #ifdef  DEBUG_WRITE
               printf( "正好写满一簇.\n" ) ;
               #endif
               
               Cluster = x16CheckClus( ) ;
               if ( Cluster == 0x00 )
                    return( ERR_FullDisk ) ;
               else  if ( Cluster == ERR_CheckClus )
                    return( ERR_CheckClus ) ;    
                    
               s = x16List( files[ i ].clus.fat16.EndClus, Cluster, ModeZ1 ) ;
               if( s != ListSuccess )
                    return( s ) ;
               files[ i ].clus.fat16.EndClus = Cluster ;
               files[ i ].EndSector = ( ( files[ i ].clus.fat16.EndClus - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ;
               files[ i ].wr.write.WritedSectors = 0 ;
          }
		   }
		   //数据写完后重新组织FILEBUF
		   memcpy( FILEBUF, FILEBUF + ( writesectors << FAT.shift ), files[ i ].wr.write.extra ) ;

		   //调试语句
     #ifdef  DEBUG_WRITE 
		   printf( " 写入成功 ! \n " ) ;
		   #endif
		   return( WriteSuccess ) ;
}

/*********************************************************************************************************
** 函数名称: FATClose
** 功能描述: 关闭文件
**
** 输 入: FileNum: 要关闭的文件编号
** 输 出: 文件缓冲区FILE_BUF中不满一个扇区的零碎数据被刷新到文件中
**           A.返回ERR_Close报告异常传输错误  
**           B.返回CloseSuccess则操作成功
**
** 全局变量: files[ i ].wr.write.extra, wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector ,
**           FAT.shift, FAT.SecPerClus
** 调用模块: x16List, mReadSector, x16CheckClus,  mWriteSector, memcpy
** 调试码:   DEBUG_CLOSE
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  FATClose( UINT8 FileNum )
{
     UINT8  i ;
     UINT8  s ;
     UINT8  *POINT0 ;
     UINT8  TransNum ;
     UINT16 time ;
     UINT16 date ;
     UINT32 ProcessSector ;
     
     //计算系统日期、时间
     time = sysclock.time.hour << 11 + sysclock.time.min << 5 + sysclock.time.sec >> 1 ;
     date = sysclock.date.year >> 9 + sysclock.date.month << 5 + sysclock.date.day ;
     
     //调试语句
     #ifdef  DEBUG_CLOSE
     printf( "关闭文件 !\n" ) ;
     #endif
     
     /*
     for ( i = 0; i < 2; i ++ )
          printf( "files[ i ].Flags = %d\n", ( UINT16 )files[ i ].Flags ) ;
     //确定指定文件是否有效
     for ( i = 0; i < 2; i ++ )
          if ( ( files[ i ].Flags & 0x07 ) == FileNum )
               break ;
     if ( ! ( files[ i ].Flags & 0x80 ) || ( ( files[ i ].Flags & 0x07 ) != i ) )
     {
          printf( " 此时的文件信息:files[ i ].Flags = %d\n ", ( UINT16 )files[ i ].Flags ) ;
          printf( " 错误的文件编号: %d\n ", ( UINT16 )i ) ;
          return( ERR_Close ) ;
     }*/
     /*  下面这段实际只是为保险起见,在程序测试无错后可以用下面这句代替 */
     i = FileNum ;
     
     //判断文件关闭前是写入的还是读取的
     if ( files[ i ].Flags & 0x08 )  //写入
     {
          printf( "关闭刚才写操作的文件.\n" ) ;
          
          ProcessSector = files[ i ].EndSector ;
          s = mWriteSector( ProcessSector, 1, FILEBUF );
		        if ( s != USB_INT_SUCCESS )
		             return( ERR_Write ) ;
		        
		        //更新FAT 
		        s = x16List( files[ i ].clus.fat16.EndClus, 0xFFFF, ModeZ1 ) ;
          if( s != ListSuccess )
               return( s ) ;
		        
		        //更新目录信息     
		        ProcessSector = files[ i ].find.Sector ;
          POINT0 = files[ i ].find.Offset ;
          TransNum = files[ i ].find.TransNum ;
          printf( " 读取该文件目录信息: \n " ) ;
          printf( " ProcessSector = %ld\n ", ProcessSector ) ;
          printf( " POINT0 = %p\n ", POINT0 ) ;
          printf( " TransNum = %d\n ", ( UINT16 )TransNum ) ;
          s = mReadSector( ProcessSector, TransNum, DISKBUF );
		        if ( s != USB_INT_SUCCESS )
		             return( ERR_Write ) ;
		        *( POINT0 + 28 ) = ( UINT8 )files[ i ].FileSize ;
          *( POINT0 + 29 ) = ( UINT8 )( files[ i ].FileSize >>  8 ) ;
          *( POINT0 + 30 ) = ( UINT8 )( files[ i ].FileSize >> 16 ) ;
          *( POINT0 + 31 ) = ( UINT8 )( files[ i ].FileSize >> 24 ) ;
          *( POINT0 + 18 ) = ( UINT8 )date ;
          *( POINT0 + 19 ) = ( UINT8 )( date >> 8 ) ;
          *( POINT0 + 22 ) = ( UINT8 )time ;
          *( POINT0 + 23 ) = ( UINT8 )( time >> 8 ) ;
          *( POINT0 + 24 ) = ( UINT8 )date ;
          *( POINT0 + 25 ) = ( UINT8 )( date >> 8 ) ;
          s = mWriteSector( ProcessSector, TransNum, DISKBUF );
		        if ( s != USB_INT_SUCCESS )
		             return( ERR_Write ) ;
		   }
		   else                               //读取
		   {   
		        printf( "关闭刚才读操作的文件.\n" ) ;
		    
		        //更新目录信息     
		        ProcessSector = files[ i ].find.Sector ;
          POINT0 = files[ i ].find.Offset ;
          TransNum = files[ i ].find.TransNum ;
          printf( " 读取该文件目录信息: \n " ) ;
          printf( " ProcessSector = %ld\n ", ProcessSector ) ;
          printf( " POINT0 = %p\n ", POINT0 ) ;
          printf( " TransNum = %d\n ", ( UINT16 )TransNum ) ;
          s = mReadSector( ProcessSector, TransNum, DISKBUF );
		        if ( s != USB_INT_SUCCESS )
		             return( ERR_Read ) ;
          *( POINT0 + 18 ) = ( UINT8 )date ;
          *( POINT0 + 19 ) = ( UINT8 )( date >> 8 ) ;
          s = mWriteSector( ProcessSector, TransNum, DISKBUF );
		        if ( s != USB_INT_SUCCESS )
		             return( ERR_Write ) ;
		   }
		   
		   //删除文件信息结构
		   files[ i ].Flags = 0x00 ;
     
     //调试语句
     #ifdef  DEBUG_CLOSE 
		   printf( " 关闭文件成功 ! \n " ) ;
		   #endif
		   return( CloseSuccess ) ;
}

/*********************************************************************************************************
** 函数名称: FATCopy
** 功能描述: 复制文件
**
** 输 入: deststr: 为要操作的目标文件名( 路径形式,例如: "/……/……/…….……" )
**         scrstr:  为要操作的源文件名( 路径形式,例如: "/……/……/…….……" ) 
** 输 出: 源文件的数据信息写入到目标文件中
**           A.返回ERR_Copy报告异常传输错误  
**           B.返回CopySuccess则操作成功
**
** 全局变量: FileNums, DiskNums
** 调用模块: FATOpen, x16ReadFile, x16WriteFile, FATClose
** 调试码:   DEBUG_CLOSE
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  FATCopy( const UINT8 *deststr, const UINT8 *scrstr )
{
	    UINT8  s ;
     UINT8  endflag ;
     UINT8  ReadNums ;
     UINT16 WriteNums ;
     
     endflag = 0 ;
     ReadNums = FileNums ;
     WriteNums = DiskNums ;
     
     s = FATOpen( scrstr , ModeB1 ) ;
			  if ( s != OpenSuccess )
		   {
		        printf( " The Open Process Has A BIG WRONG: " ) ;
		        printf( " ERROR = %02X \n ", ( UINT16 )s );
		        return( s ) ;
		   }
		   
				 s = FATOpen( deststr, ModeB5 ) ;
			  if ( s != OpenSuccess )
		   {
		        printf( " The Open Process Has A BIG WRONG: " ) ;
		        printf( " ERROR = %02X \n ", ( UINT16 )s );
		        return( s ) ;
		   }
		   
		   while ( 1 )
		   { 
				      s = x16ReadFile( FileNums, 0 ) ;
				      if ( s == Clu_End )
				           WriteNums = files[ 0 ].wr.read.ReadSectors << FAT.shift ;
				      else  if ( s == File_End )
				      {
				           WriteNums = files[ 0 ].ShortLength ? ( ( ( files[ 0 ].wr.read.ReadSectors - 1 ) << FAT.shift ) + files[ 0 ].ShortLength ) : ( files[ 0 ].wr.read.ReadSectors << FAT.shift ) ;
				           printf( " WriteNums = %d\n ", WriteNums ) ;
				           endflag = 1 ;
				      	    printf( " The Copy will end !\n " ) ;
					     }  
				      else  if ( s != ReadSuccess )
		        {
		             printf( " The Read Process Has A BIG WRONG: " ) ;
		             printf( " ERROR = %02X \n ", ( UINT16 )s );
		             return( s ) ;
		        }
		        else
		             WriteNums = DISKBUF_BYTES ;
		   
		        s = x16WriteFile( WriteNums, 1 ) ;
				      if ( s != WriteSuccess )
		        {
		             printf( " The Write Process Has A BIG WRONG: " ) ;
		             printf( " ERROR = %02X \n ", ( UINT16 )s );
		             return( s ) ;
		        }

				      if ( endflag )
					          break ;
		   }
		   
		   s = FATClose( 0 ) ;
			  if ( s != CloseSuccess )
		   {
		        printf( " The Close Process Has A BIG WRONG: " ) ;
		        printf( " ERROR = %02X \n ", ( UINT16 )s );
		        return( s ) ;
		   }

		   s = FATClose( 1 ) ;
			  if ( s != CloseSuccess )
		   {
		        printf( " The Close Process Has A BIG WRONG: " ) ;
		        printf( " ERROR = %02X \n ", ( UINT16 )s );
		        return( s ) ;
		   }
		   
		   return( CopySuccess ) ;
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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