📄 ch375hft.c
字号:
for ( c = 0; c < 255; c ++ ) { /* 最多搜索前255个文件 */
i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, pCodeStr ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */
mCmdParam.Open.mPathName[ i ] = c; /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */
i = CH375FileOpen( ); /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */
if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
if ( i == ERR_FOUND_NAME ) { /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
printf( " match file %03d#: %s\n", (unsigned int)c, mCmdParam.Open.mPathName ); /* 显示序号和搜索到的匹配文件名或者子目录名 */
continue; /* 继续搜索下一个匹配的文件名,下次搜索时序号会加1 */
}
else { /* 出错 */
mStopIfError( i );
break;
}
}
}
else { /* 找到文件或者出错 */
mStopIfError( i );
/* printf( "Query\n" );
i = CH375FileQuery( ); 查询当前文件的信息
mStopIfError( i );*/
printf( "Read\n" );
if ( CH375vFileSize > CH375vSectorSize * 3 ) { /* 由于用单片机内置的1KB外部RAM演示,每次只能读取一个扇区,假定演示读取最多3个扇区 */
SecCount = 3; /* 演示读取最多3个扇区, 分3次, 每次读取一个扇区并处理 */
NewSize = CH375vSectorSize * 3;
}
else { /* 如果原文件较小,那么使用原长度 */
SecCount = ( CH375vFileSize + CH375vSectorSize - 1 ) / CH375vSectorSize; /* 计算文件的扇区数,因为读写是以扇区为单位的,先加CH375vSectorSize-1是为了读出文件尾部不足1个扇区的部分 */
NewSize = (UINT16)CH375vFileSize; /* 原文件的长度 */
}
printf( "Size=%ld, Len=%d, Sec=%d\n", CH375vFileSize, NewSize, (UINT16)SecCount );
CH375vFileSize += CH375vSectorSize -1 ; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */
while( SecCount ) { /* 分多次读取文件数据 */
mCmdParam.Read.mSectorCount = 1; /* 由于RAM缓冲区有限,所以只读取1个数据 */
/* current_buffer = & FILE_DATA_BUF[0]; 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
i = CH375FileRead( ); /* 从文件读取数据 */
mStopIfError( i );
CH375DirtyBuffer( ); /* 因为文件读写缓冲区与磁盘数据缓冲区重叠,所以在CH375FileRead读文件后和在CH375FileWrite写文件前必须清除磁盘缓冲区 */
i = FILE_DATA_BUF[100];
FILE_DATA_BUF[100] = 0; /* 置字符串结束标志,最多显示100个字符 */
printf( "Line 1: %s\n", FILE_DATA_BUF ); /* 用显示数据代替对数据的处理 */
FILE_DATA_BUF[100] = i; /* 恢复原字符 */
SecCount --;
}
CH375vFileSize -= CH375vSectorSize - 1; /* 恢复原文件长度 */
/*
如果文件比较大,一次读不完,可以再调用CH375FileRead继续读取,文件指针自动向后移动
while ( 1 ) {
mCmdParam.Read.mSectorCount = 1; 指定读取的扇区数
CH375FileRead(); 读完后文件指针自动后移
CH375DirtyBuffer( ); 因为文件读写缓冲区与磁盘数据缓冲区重叠,所以在CH375FileRead读文件后和在CH375FileWrite写文件前必须清除磁盘缓冲区
处理已读出的CH375vSectorSize字节数据,完成后继续读取下一个扇区
if ( mCmdParam.Read.mSectorCount != 1 ) break; 实际读出的扇区数较小则说明文件已经结束
}
如果希望从指定位置开始读写,可以移动文件指针
mCmdParam.Locate.mSectorOffset = 3; 跳过文件的前3个扇区开始读写
i = CH375FileLocate( );
mCmdParam.Read.mSectorCount = 1;
CH375FileRead(); 直接读取从文件的第(CH375vSectorSize*3)个字节开始的数据,前3个扇区被跳过
CH375DirtyBuffer( ); 因为文件读写缓冲区与磁盘数据缓冲区重叠,所以在CH375FileRead读文件后和在CH375FileWrite写文件前必须清除磁盘缓冲区
如果希望将新数据添加到原文件的尾部,可以移动文件指针
CH375FileOpen( );
CH375FileQuery( );
OldSize = mCmdParam.Modify.mFileSize;
mCmdParam.Locate.mSectorOffset = 0xffffffff; 移到文件的尾部,以扇区为单位,如果原文件是3字节,则从CH375vSectorSize字节开始添加
CH375FileLocate( );
for ( i=0; i!=新增扇区数; i++ ) { 为了申请文件空间而写入无效数据
mCmdParam.Write.mSectorCount = 1;
CH375FileWrite( );
}
mCmdParam.Locate.mSectorOffset = (OldSize+CH375vSectorSize-1)/CH375vSectorSize; 移到文件的原尾部,以扇区为单位,如果原文件是3字节,则从CH375vSectorSize字节开始添加
CH375FileLocate( );
for ( i=0; i!=新增扇区数; i++ ) { 分多次写入真正的文件数据
CH375DirtyBuffer( ); 因为文件读写缓冲区与磁盘数据缓冲区重叠,所以在CH375FileRead读文件后和在CH375FileWrite写文件前必须清除磁盘缓冲区
将准备写入文件的数据复制到文件数据缓冲区,如果文件数据复制方式为"外部子程序",那么可以由xReadFromExtBuf将数据直接送给CH375芯片而不经过文件数据缓冲区
mCmdParam.Write.mSectorCount = 1;
CH375FileWrite(); 在原文件的后面添加数据
}
*/
printf( "Close\n" );
i = CH375FileClose( ); /* 关闭文件 */
mStopIfError( i );
}
#ifdef EN_DISK_WRITE /* 子程序库支持写操作 */
/* 产生新文件 */
LED_WR_ACT( ); /* 写操作 */
NewSize = CH375vSectorSize * 4; /* 新文件的长度 */
SecCount = 4; /* (NewSize+CH375vSectorSize-1)/CH375vSectorSize, 计算文件的扇区数,因为读写是以扇区为单位的 */
printf( "Create\n" );
mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "\\程序空间.BIN" ); /* 新文件名,在根目录下,中文文件名 */
i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
mStopIfError( i );
printf( "PreWrite\n" );
/* 新建文件的长度为1, 占用一个簇, 如果后面准备写入的数据总长度超过一个簇, 就需要在CH375FileWrite过程中自动申请文件空间,
而申请文件空间的过程需要用到磁盘数据缓冲区, 由于本例中RAM太少使磁盘数据缓冲区与文件数据缓冲区合用,
所以CH375FileWrite过程中自动申请文件空间会导致文件数据缓冲区中的数据无效, 所以实际上这个时候写入的数据没有意义,
如果事先知道后续数据的总长度不超过一个簇(簇在Windows中称为"分配单元"的大小), 那么可以跳过这个为了申请文件空间而写入无效数据的步骤 */
for ( i = 0; i != SecCount; i ++ ) {
mCmdParam.Write.mSectorCount = 1; /* 写入1个扇区的数据 */
/* current_buffer = & FILE_DATA_BUF[0]; 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
mStopIfError( CH375FileWrite( ) ); /* 向文件写入数据,只是为了申请文件空间,实际写入的数据没有意义 */
}
printf( "Locate head\n" );
mCmdParam.Locate.mSectorOffset = 0; /* 因为前面申请文件空间使文件指针处于尾部,所以在写入真正的数据前需要将文件指针回到头部 */
i = CH375FileLocate( ); /* 移动文件指针到文件头部 */
mStopIfError( i );
printf( "Write\n" );
pCodeStr = 0; /* 从程序空间的起始地址开始取数据 */
while( SecCount ) { /* 分多次写入真正的文件数据 */
CH375DirtyBuffer( ); /* 因为文件读写缓冲区与磁盘数据缓冲区重叠,所以在CH375FileRead读文件后和在CH375FileWrite写文件前必须清除磁盘缓冲区 */
/* 将准备写入文件的数据复制到文件数据缓冲区,如果文件数据复制方式为"外部子程序",
那么可以由自己定义的"外部子程序"xReadFromExtBuf将数据直接送给CH375芯片而不经过文件数据缓冲区,该子程序被CH375FileWrite子程序调用 */
for ( count = 0; count != CH375vSectorSize; count ++ ) { /* 本例是将程序空间的数据复制到文件数据缓冲区再写入文件 */
FILE_DATA_BUF[ count ] = *pCodeStr; /* 实际应用中,数据可以来自外部ADC或者日志数据 */
pCodeStr ++;
}
mCmdParam.Write.mSectorCount = 1; /* 写入1个扇区的数据 */
/* current_buffer = & FILE_DATA_BUF[0]; 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
i = CH375FileWrite( ); /* 向文件写入数据 */
mStopIfError( i );
SecCount --;
}
/* printf( "Modify\n" );
mCmdParam.Modify.mFileAttr = 0xff; 输入参数: 新的文件属性,为0FFH则不修改
mCmdParam.Modify.mFileTime = 0xffff; 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间
mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2004, 5, 18 ); 输入参数: 新的文件日期: 2004.05.18
mCmdParam.Modify.mFileSize = NewSize; 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32
i = CH375FileModify( ); 修改当前文件的信息,修改日期和长度
mStopIfError( i );
*/
printf( "Close\n" );
mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,如果自动计算,那么该长度总是CH375vSectorSize的倍数 */
i = CH375FileClose( );
mStopIfError( i );
/* 删除某文件 */
/* printf( "Erase\n" );
mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "\\OLD" ); 将被删除的文件名,在根目录下
i = CH375FileErase( ); 删除文件并关闭
if ( i != ERR_SUCCESS ) printf( "Error: %02X\n", (UINT16)i ); 显示错误
*/
LED_WR_INACT( );
/* 查询磁盘信息 */
/* printf( "Disk\n" );
i = CH375DiskQuery( );
mStopIfError( i );
printf( "Fat=%d, Total=%ld, Free=%ld\n", (UINT16)mCmdParam.Query.mDiskFat, mCmdParam.Query.mTotalSector, mCmdParam.Query.mFreeSector );
*/
#endif
LED_RUN_INACT( );
printf( "Take out\n" );
while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘拔出 */
LED_OUT_INACT( ); /* LED灭 */
mDelay100mS( );
mDelay100mS( );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -