U盘文件读写模块向已有文件追加数据结果成乱码

标准版U盘文件读写模块,并口查询连接,单片机是内部带1024字节RAM的,在原文件后面追加同样的数据结果怎么老是乱码啊~~~~~

printf( "Open\n" ); memcpy( mCmdParam.Open.mPathName, "\\测量数据.TXT", MAX_PATH_LEN ); i = ExecCommand( CMD_FileOpen, MAX_PATH_LEN ); if ( i == ERR_MISS_FILE ) { printf( "Create\n" ); memcpy( mCmdParam.Create.mPathName, "\\测量数据.TXT", MAX_PATH_LEN ); i = ExecCommand( CMD_FileCreate, MAX_PATH_LEN ); mStopIfError( i ); NewSize = 0; } else { /* 找到文件\测量数据.TXT或者出错 */ mStopIfError( i ); printf( "Query\n" ); i = ExecCommand( CMD_FileQuery, 0 ); /* 查询当前文件的信息,没有输入参数 */ mStopIfError( i ); OldSize = mCmdParam.Modify.mFileSize; /* 原文件的长度 */ SecCount = ( OldSize + 511 ) >> 9; /* (OldSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的 */ NewSize = (unsigned short)OldSize; /* 原长度 */ printf( "Size=%ld, Len=%d, Sec=%d\n", OldSize, NewSize, (unsigned short)SecCount );

mCmdParam.Locate.mSectorOffset = 0xFFFFFFFF; i = ExecCommand( CMD_FileLocate, 4 ); mStopIfError( i ); } printf( "Write\n" ); strcpy( DATA_BUF, "abcdef\xd\n"); mCmdParam.Write.mSectorCount = 0x01; /* 写入一个扇区*/ i = ExecCommandBuf( CMD_FileWrite, 1, DATA_BUF ); /* 向文件写入数据 */ /*printf("%d\n",mCmdParam.Write.mSectorCount);*/ mStopIfError( i );

NewSize = NewSize + strlen( DATA_BUF ); /* 新文件的长度 */

printf( "Modify\n" ); mCmdParam.Modify.mFileAttr = 0xff; /* 输入参数: 新的文件属性,为0FFH则不修改 */ mCmdParam.Modify.mFileTime = 0xffff; mCmdParam.Modify.mFileDate = ( (2004-1980)<<9 ) + ( 5<<5 ) + 18; /* 输入参数: 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = NewSize; /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限 */ i = ExecCommand( CMD_FileModify, 4+2+2+1 ); mStopIfError( i );

mDelaymS( 500 ); printf( "Close\n" ); mCmdParam.Close.mUpdateLen = 0; /* 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 */ i = ExecCommand( CMD_FileClose, 1 ); mStopIfError( i );

第一次写的数据是正确的,但是第二次往后面追加的数据就变成乱码了,结果是这样: abcdef o<可Y# 修改文件长度应该不会有问题吧,请达人指点!!

第二次操作时,文件中有数据“abcdef”,采用 mCmdParam.Locate.mSectorOffset = 0xFFFFFFFF; i = ExecCommand( CMD_FileLocate, 4 ); 进行跳转之后,指针其实应该还是指向文件开头,并不是“abcdef”之后,第二次写其实还只是写了“abcdef”,只是在更新文件长度时将后面未知的数据追加上去而已。

数据量少的话,你可以采用字节方式进行读写,字节跳转的话很容易跳到文件最后;而采用扇区方式的话,得先把最后不足一个扇区的数据读出来,用CMD_FileLocate跳到整扇区之后,再追加。


谢谢了!!我改用字节方式可以了 用字节方式,指针是以字节为单位;若用扇区方式,这个指针是以扇区为单位,是这个意思吗? 那么我要用扇区方式的话,是不是应该把最后不足一个扇区的数据读出来,然后再加上我第二次要写的数据,一块拼接好再写到最后这个扇区呢?也就是说那些不足一个扇区的数据要重写一遍??


1.是的 2.扇区操作时是以整扇区为单位的,不足一个扇区的发CMD_FileReadLast命令将其读出来,然后一起写进去.


多谢两位大虾!!! 现在字节和扇区模式都OK了~~


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