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

📄 writefile.c

📁 全国电子设计大赛:智能电动车的设计.实现功能:以AT89C52单片机为核心
💻 C
📖 第 1 页 / 共 2 页
字号:

	if ( mIntStatus == ERR_USB_CONNECT )   // 等待U盘连接,由中断服务程序产生状态 
	{
	    // 查询当前模块的状态,实际上用于撤消模块产生的中断 
		for( i=0; i<10; i++ ) 
		{
		    ExecCommand( CMD_QueryStatus, 0 ); 
			if( mCmdParam.Status.mDiskStatus == DISK_CONNECT ) break;  // 有时候,USB端口接触不良或者插拔不干脆,导致U盘刚连接又断开 
		}
		LED_OUT_ACT( );  // LED亮, 表示正在对U盘进行操作 

		// 检查U盘是否准备好,大多数U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 
		for ( i = 0; i < 5; i ++ ) 
		{
			mDelaymS( 10 );
			if ( ExecCommand( CMD_DiskReady, 0 ) == ERR_SUCCESS ) break;  // 查询磁盘是否准备好 
		}

		modifying    = 1;   // 用于清屏之用 ,显示U盘操作进度之前的清屏 
		confirm_down = 1;
		SCREEN = 50; 
		Display( );

		//---------------------------------------
		// 读取原文件 
		DisplayGuage ( guage++ ); // 显示U盘操作进度 
		memcpy( mCmdParam.Open.mPathName, "\\智能小车.TXT", MAX_PATH_LEN );  // 文件名,在根目录下 
		i = ExecCommand( CMD_FileOpen, MAX_PATH_LEN );  // 打开文件,输入参数置为最大值,省得再计算参数长度 
		if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE )  // ERR_MISS_DIR说明没有找到C51子目录,ERR_MISS_FILE说明没有找到文件 
		{  
		    //---------------------------------------
		    // 没有找到指定的文件,则产生新文件 
			superaddition = 0;        // 追加数据次数清零 
		    DisplayGuage ( guage++ ); // 显示U盘操作进度 
		    memcpy( mCmdParam.Create.mPathName, "\\智能小车.TXT", MAX_PATH_LEN );  // 新文件名,在根目录下 
		    i = ExecCommand( CMD_FileCreate, MAX_PATH_LEN );  // 新建文件并打开,如果文件已经存在则先删除后再新建 
		    mStopIfError( i );

		    DisplayGuage ( guage++ ); // 显示U盘操作进度 
		    WriteDataToBUF( DATA_BUF ); // 向缓冲区写入数据块文件 
		    SecCount = ( WriteFileSize + 511 ) >> 9;  // (WriteFileSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的 
		    mCmdParam.Write.mSectorCount = SecCount;  // 写入扇区的数目 
		    buffer = DATA_BUF;  // 存放数据的缓冲区的起始地址,由CH375模块中断服务程序负责写入数据 
		    i = ExecCommand( CMD_FileWrite, 1 ); // 向文件写入数据 
		    mStopIfError( i );

			//---------------------------------------
			// 更新文件目录信息 
		    DisplayGuage ( guage++ ); // 显示U盘操作进度 
			mCmdParam.FileDirInfo.mAccessMode = 0;  // 0=读取文件目录信息,0F0H=写入/更新文件目录信息 
			mCmdParam.FileDirInfo.mReserved[0] = mCmdParam.FileDirInfo.mReserved[1] = mCmdParam.FileDirInfo.mReserved[2] = 0;  // 保留单元 
			i = ExecCommand( CMD_FileDirInfo, 4 );  // 读取当前文件目录信息 
		    mStopIfError( i ); 
			mCmdParam.FileDirInfo.mAccessMode = 0xF0;  // 0=读取文件目录信息,0F0H=写入/更新文件目录信息 
			mCmdParam.FileDirInfo.mDir.DIR_Attr = ATTR_ARCHIVE; // 文件为存档属性 
			mCmdParam.FileDirInfo.mDir.DIR_CrtTime = SwapUINT16( MAKE_FILE_TIME( time_buf[2],time_buf[1],time_buf[0] ) );
			mCmdParam.FileDirInfo.mDir.DIR_CrtDate = SwapUINT16( MAKE_FILE_DATE( time_buf[6],time_buf[5],time_buf[4] ) );
			mCmdParam.FileDirInfo.mDir.DIR_WrtTime = SwapUINT16( MAKE_FILE_TIME( time_buf[2],time_buf[1],time_buf[0] ) );
			mCmdParam.FileDirInfo.mDir.DIR_WrtDate = SwapUINT16( MAKE_FILE_DATE( time_buf[6],time_buf[5],time_buf[4] ) );
			i = ExecCommand( CMD_FileDirInfo, MAX_PATH_LEN );   // 修改当前文件的信息 
		    mStopIfError( i );

			//---------------------------------------
			// 更新文件长度 
		    DisplayGuage ( guage++ ); // 显示U盘操作进度 
		    mCmdParam.Modify.mFileAttr = 0xFF;          // 输入参数: 新的文件属性(为0FFH则不修改),文件为存档属性 
		    mCmdParam.Modify.mFileTime = 0xFFFF;        // 输入参数: 新的文件时间(为0FFFFH则不修改),使用当前时间 
		    mCmdParam.Modify.mFileDate = 0xFFFF;        // 输入参数: 新的文件日期(为0FFFFH则不修改),使用当前日期 
		    mCmdParam.Modify.mFileSize = WriteFileSize; // 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限 
		    i = ExecCommand( CMD_FileModify, 4+2+2+1 ); // 修改当前文件的信息,修改日期和长度,参数长度为sizeof(mCmdParam.Modify.mFileSize)+... 
		    mStopIfError( i );

		    DisplayGuage ( guage++ ); // 显示U盘操作进度 
		    mCmdParam.Close.mUpdateLen = 0;  // 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 
		    i = ExecCommand( CMD_FileClose, 1 );
		    mStopIfError( i );
		}
		else // 找到文件,说明文件已存在,因为不打算覆盖原数据,所以移动文件指针到末尾,以便追加数据 
		{
			mStopIfError( i );
			
			//---------------------------------------
			// 查询当前文件的信息  
			DisplayGuage ( guage++ ); // 显示U盘操作进度 
			i = ExecCommand( CMD_FileQuery, 0 );     
			OldFileSize = mCmdParam.Modify.mFileSize;    // 原文件的大少 
			
			//---------------------------------------
			// 读取尾部不足一个扇区的零碎数据到缓冲区: Last_BUF[ 512 ]  
			DisplayGuage ( guage++ ); // 显示U盘操作进度 
			buffer =  LAST_BUF;   
			i = ExecCommand( CMD_FileReadLast, 0 );  // 读取尾部不足一个扇区的零碎数据 
			mStopIfError( i );
			LastSize = strlen( LAST_BUF );  // 尾部不足一个扇区的零碎数据字节数 
			strcpy ( DATA_BUF, LAST_BUF );  // 将尾部不足一个扇区的数据追加到数据缓冲区前面,作为追加之用 

			superaddition++;                // 追加数据次数计数 

			mCmdParam.Locate.mSectorOffset = 0xFFFFFFFF; // 移动到文件尾,用于在CMD_FileOpen打开文件后,继续追加数据到已打开文件的末尾 
			i = ExecCommand( CMD_FileLocate, 4 );        // 以扇区为单位移动文件指针 
			mStopIfError( i );

		    DisplayGuage ( guage++ ); // 显示U盘操作进度 
		    WriteDataToBUF( DATA_BUF + LastSize );    // 向缓冲区写入数据块文件 
		    SecCount = ( WriteFileSize + LastSize + 511 ) >> 9;  // (WriteFileSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的 
		    mCmdParam.Write.mSectorCount = SecCount;  // 写入扇区的数目 
		    buffer =  DATA_BUF;  // 存放数据的缓冲区的起始地址,由CH375模块中断服务程序负责写入数据 
		    i = ExecCommand( CMD_FileWrite, 1 ); // 向文件写入数据 
		    mStopIfError( i );

			TotalFileSize = OldFileSize + WriteFileSize;   // 文件总大少 

		    DisplayGuage ( guage++ ); // 显示U盘操作进度 
		    mCmdParam.Modify.mFileAttr = ATTR_ARCHIVE;  // 输入参数: 新的文件属性(为0FFH则不修改),文件为存档属性 
		    mCmdParam.Modify.mFileTime = MAKE_FILE_TIME( time_buf[2],time_buf[1],time_buf[0] ); // 输入参数: 新的文件时间(为0FFFFH则不修改),使用当前时间 
		    mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( time_buf[6],time_buf[5],time_buf[4] ); // 输入参数: 新的文件日期(为0FFFFH则不修改),使用当前日期 
		    mCmdParam.Modify.mFileSize = TotalFileSize; // 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限 
		    i = ExecCommand( CMD_FileModify, 4+2+2+1 ); // 修改当前文件的信息,修改日期和长度,参数长度为sizeof(mCmdParam.Modify.mFileSize)+... 
		    mStopIfError( i );

		    DisplayGuage ( guage++ ); // 显示U盘操作进度 
		    mCmdParam.Close.mUpdateLen = 0;  // 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 
		    i = ExecCommand( CMD_FileClose, 1 );
		    mStopIfError( i );
		/*
		    // 字节模式追加数据 
			mStopIfError( i );
			superaddition++;      // 追加数据次数计数 
			mCmdParam.ByteLocate.mByteOffset = 0xFFFFFFFF;    // 移动到文件尾,用于在CMD_FileOpen打开文件后,继续追加数据到已打开文件的末尾 
			i = ExecCommand( CMD_ByteLocate, 4 );           // 以扇区为单位移动文件指针 
			mStopIfError( i );

			DisplayGuage ( guage++ ); // 显示U盘操作进度 
		    strcpy( mCmdParam.ByteWrite.mByteBuffer, "今天的ADC数据到此结束\xd\xa" );
		    i = strlen( mCmdParam.ByteWrite.mByteBuffer );  // 计算字符串长度 ( 0--255 )
		    mCmdParam.ByteWrite.mByteCount = i;     // 将原文件中的20个字节的数据添加到新文件的末尾 
		    i = ExecCommand( CMD_ByteWrite, i+1 );  // 以字节为单位向文件写入数据 
		    mStopIfError( i );

			string = "Close "; UART1SendString ( string );
		    DisplayGuage ( guage++ ); // 显示U盘操作进度 
		    mCmdParam.Close.mUpdateLen = 1;       // 自动计算文件长度,当以字节为单位向文件写入数据后,如果没有用0长度的CMD_ByteWrite更新文件长度,那么可以在关闭文件时让模块自动更新文件长度 
		    i = ExecCommand( CMD_FileClose, 1 );  // 关闭文件,当以字节为单位向文件写入(追加)数据后,必须在用完文件后关闭文件 
		    mStopIfError( i );*/
		}

		//---------------------------------------
		// Over 
		DisplayGuage ( 16 ); // 显示U盘操作进度( 操作结束 ) 
		LED_OUT_INACT( );    // LED灭 
		confirm_down = 1;
		SCREEN = 0;
	}

//	else  
//	string = "Disk not connect! "; UART1SendString ( string );
}

//=================================================================================================
//                                   USBP 初始化子程序  
//=================================================================================================
// USB Init 
void USBInit( void )
{
	unsigned char i;

#ifdef CH375HM_INT 
  #if CH375HM_INT == 1      // 假定CH375模块的INT#引脚连接到单片机的中断引脚 
	// 置CH375模块中断信号为下降沿触发( IE6CF = 0 ),实际上,电平触发方式也可以 
	CH375HM_INT_FLAGN( );   // 清中断标志 
	CH375HM_INT_EN( );      // 允许CH375模块中断 
	EA = 1;                 // 初始化完成,开中断 
  #endif
#endif

	mCmdParam.Setup.mSetup = 0x01;         // 输入参数: 模块配置值,位0为1则空闲时查询U盘连接状态并自动中断通知 
	i = ExecCommand( CMD_SetupModule, 1 ); // 设置模块配置 
	mStopIfError( i );
}



⌨️ 快捷键说明

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