调用CH375的程序库问题

应该是mCmdParam.ReadX.mSectorCount = 1;是想读一个扇区 CH375FileReadX()之前要指定缓冲区的话,是不是还要定义个新的缓冲区(至少512个字节) 那与DISK_BASE_BUF加起来系统是不是至少要1K的RAM


1.建议你直接调用CH375FileRead(),CH375FileWrite()函数就可以了,使用CH375FileReadX(),CH375FileWriteX()函数之前需要指定数据缓冲区的地址. mCmdParam.ReadX.mSectorCount = SectorCount; mCmdParam.ReadX.mDataBuffer = &My_Dat_Buf[ 0 ]; i = CH375FileReadX( ); mStopifError(i); 2.网站中的例子程序中都会有函数注释,有这两个函数使用时的注意事项,建议在写代码前好好阅读提供的示例程序.另外,你需要仔细看看CH375HF.PDF,里面提供的库函数的说明. 3.磁盘缓冲区是不可以省的,你可以将文件缓冲区与磁盘缓冲区共用.虽然这样可以省一些RAM,但是操作文件的速度会慢点,对磁盘缓冲区的处理也需要注意.你可以看看CH375LIB\MCS51\FILELIB4\EXAM3,这个示例程序


可以和DISK_BASE_BUF共用,但速度就要慢许多,流程上也复杂一些,参考EXAM3


照着EXAM3样子做了一下 CH375FileRead()成功后,DISK_BASE_BUF和FILE_DATA_BUF中内容一样,但都不是我U盘中的文件里的内容


流程与EXAM3完全一样么?估计还是你的流程有问题,把打开文件后,读数据部分的程序贴出来


一开始定义: #define LIB_CFG_DISK_IO 2 #define LIB_CFG_FILE_IO 2 #define LIB_CFG_INT_EN 0

#define CH375_CMD_PORT_ADDR 0xFFFF /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xFEFF /* CH375数据端口的I/O地址 */ #define DISK_BASE_BUF_ADDR 0x0000 #define FILE_DATA_BUF_ADDR 0x0000 #define FILE_DATA_BUF_LEN 0x0200 #define CH375_INT_WIRE INT0 #include "CH375HF6.H" ...................

CH375FileRead()成功后

mCmdParam.Read.mSectorCount = 1; i=CH375FileRead();

就这两句 i能成功返回ERR_SUCCESS 但是读到的数据不知道在哪里?DISK_BASE_BUF和FILE_DATA_BUF中都不是

另外: 字节读写都已经成功实现数据读写[启用函数 CH375ByteRead() CH375ByteWrite()]


你按扇区方式读文件的时候,你的文件长度是多少,如果总的文件长度小于一个扇区的大小,必须将文件大小CH375vFileSize+511,然后在读取数据,否则读不出来


(1)LIB_CFG_DISK_IO 2,LIB_CFG_FILE_IO 2配置的是双DPTR的复制方式,检查单片机是否支持双DPTR (2)读出的数据自然实在文件缓冲区FILE_DAT_BUF中. (3)建议你在实验之前先使用例程去实验,调试成功后就可以在例程的基础上修改成你所需要的方式. (4)将你的程序代码打包发送上来,这种磁盘缓冲区和文件缓冲区共用的示例程序肯定是可以的,所以很有可能是你的程序流程上有问题.


_study_ 说的对,文件大小不足一扇区,CH375vFileSize = CH375vFileSize+511;可以了

看来还是忽略了文档中的“文件尾部不足一个扇区的零碎数据部分将被忽略,如果必须读出文件尾部不足一个扇区的零碎数据,那么可以临时增大CH375vFileSize 以读出最后一个扇区(实际有效数据不足一个扇区),然后再恢复原CH375vFileSize,注意此时的文件指针已经无效”

文件本身不足一个扇区,也一样


还有几个问题帮忙解释一下

1.DISK_BASE_BUF中是什么信息?DISK_BASE_BUF和FILE_DATA_BUF共用地址的话,本来DISK_BASE_BUF中的信息就不能查询到了? 2.如果写入数据时,保留原来内容,向其添加内容。(例如原文件中有10个字节的数据) 那此时 mCmdParam.Write.mSectorCount = 1; i=CH375FileWrite(); 实际上是不是要写2个扇区? 3.如果在写比较多的数据进入文件时,会发生磁盘已满。应该如何查询?


DISK_BASE_BUF是用来分析文件系统的。共用地址的话,库先把空闲簇找到就可以了,就再也不用查找空闲簇。然后一次性写入。 磁盘已满会返回相应的错误代码。空间不够。 不足一扇区的话追加数据比较麻烦,要先把不足整扇区的部分的读到缓冲区的前部,然后偏移到整扇区的地方,再写入就可以了


“不足一扇区的话追加数据比较麻烦,要先把不足整扇区的部分的读到缓冲区的前部,然后偏移到整扇区的地方,再写入就可以了” 您是说这个动作由应用程序来完成,而不是由库中的程序完成?


由用户自己完成,用户根据文件长度判断,实际的文件长度是多少,自行调整


字节方式读写都成功

扇区方式读成功,写有问题

#define DISK_BASE_BUF_ADDR 0x0000 #define FILE_DATA_BUF_ADDR 0x0000 #define FILE_DATA_BUF_LEN 0x0200

问题: 1.CH375FileCreate()后,就将文件关闭,发现创建的文件大小为1字节?正常否? 2.根目录下创建一个名为“MY.TXT”的文件,写入“12345”这5个数字。从电脑里看的时候,文件名变成“12345”,没有扩展名 程序如下: mCopyCodeStringToIRAM(mCmdParam.Create.mPathName,"/MY.TXT"); i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); for(j=0;j<512;j++) FILE_DATA_BUF[ j ] = 0; for(i=0;i<5;i++) FILE_DATA_BUF[ i ] = i+1+0x30; mCmdParam.Write.mSectorCount = 1; i = CH375FileWrite(); mStopIfError( i ); mCmdParam.Modify.mFileSize = 5 mCmdParam.Modify.mFileAttr = 0xff; mCmdParam.Modify.mFileTime = 0xffff; mCmdParam.Modify.mFileDate = 0xffff; i = CH375FileModify( ); mStopIfError( i ); mCmdParam.Close.mUpdateLen = 0; i = CH375FileClose(); mStopIfError( i );


1、库创建一个新文件,不写入新的数据,那么文件长度默认为1B 2、创建文件之后,写文件之前,需要用调用CH375DirtyBuffer,对于磁盘缓冲区和数据缓冲区共用,你看一下EXAM3是怎么做的


只有登录才能回复,可以选择微信账号登录