📄 writefile.c
字号:
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 + -