你好,我发现个怪现象,每次追加数据长度假如是16的整数倍的话,就不会出错。否则的话,结尾处总是有各种乱码。。。是不是底层字节对齐的原因啊?谢谢了。。。。
首先监控一下确保你写入的数据长度和数据都是正确的,写完之后需要更新文件长度。这种现象一般与你程序有关。
写入的没问题啊,也更新了长度了啊,只要追加数据长度假如是16的整数倍的话,就不会出任何问题。。。想不通为啥是和16有关系。。。
你把你写入部分的程序贴出来看一下,我们这边测试一下。
//对N级目录下的一个文件追加数据,如果该路径中的哪一级目录不存在,会自动创建;如果发现最后文件也不存在不存在, //那么也是直接创建,并且打开 UINT8 AddData(UINT8 *pFileName,UINT8 *pDataBuf,UINT16 dataLen) { UINT8 ack = 0; UINT16 iNum=0; UINT16 numWR; UINT16 offset=0; if( ERR_MISS_FILE == Open_Dir_File( pFileName, 0))//要对一个文件操作,首先应该打开这个文件,如果路径下的文件不存在, { //那么先自动创建这个文件,再调用一次Open_Dir_File则会打开该文件 ack = Open_Dir_File( pFileName, 0); if (ack != 0x00) //成功打开文件Open_Dir_File返回0x00 return ack; } CH376ByteLocate(0xFFFFFFFF); numWR = ( dataLen /16 ); //写数据块长度修改为16,降低存储速度以避免数据存储错位 for(iNum=0;iNum { offset = iNum *16 ; if(0==offset%450) { FEEDWDT; } //喂狗 echo = CH376ByteWrite( &pDataBuf[offset],16, &counter); } numWR = ( dataLen %16); if(numWR) { offset = (dataLen /16) *16; echo = CH376ByteWrite( &pDataBuf[offset],numWR , &counter); } Modify_Dir_File_Info( 0 ); // xWriteCH376Cmd(CMD_BYTE_WRITE); //只更新文件长度,但是不关闭文件 // xWriteCH376Data( 0x00 ); // xWriteCH376Data( 0x00 ); // echo = Wait376Interrupt( ); FEEDWDT; echo = CH376FileClose(0x01 ); //更新文件长度,并且关闭文件,一次完整的写入操作完成 return 0; }
UINT16 dataLen这个长度 假如刚好是16的整数倍的话,数据就很完美。。。。。谢谢回复了!
你的程序流程有点问题,假如你都是16的倍数只会执行前面一个CH376ByteWrite函数,当然不会出问题,但是你不是16的倍数,假设dataLen=17,那么第一个numWR=1,执行第一个写,第一个offset=16,然后第二个numWR=1,第二个offset还是=16,相当于第一次和第二次写进去的数据都是offset便宜16个字节的pDataBuf。
不对啊。假设dataLen=17,那么第一个numWR=1, for(iNum=0;iNum执行第一个写,第一个 offset = iNum *16 =0啊
&pDataBuf[offset]这个是取pDataBuf的地址吧
我把offset=iNum *16看成offset = numWR *16了,那你的流程应该没什么问题,具体错误现象是什么呢?
每次写完数据结尾处有乱码。。。。感觉是写进去了RAM中的随机值。如果把追加长度扩招为16的整数倍,就没有这个问题了。。。谢谢您的回复了
你看一下每次结尾处的有乱码是除以16余下来的数据个数吗?你说的这个16的整数倍还是跟你的程序或者你的内存分配有关系,因为你程序中对16这个数值有特殊处理,你再好好检查一下。
是的。以前按28分块存储的时候,也有这个问题,现在修改成16只是存储变慢,解决了存储错位的问题......仿真器连接看内存分配也没有问题啊
大神,能给我程序么,我在编这个程序,菜鸟不会啊个人信息保护,已隐藏
如果最后写有问题说明最后一次没有写入到U盘去了,但是U盘并没有写入到U盘的FLASH里面去。建议你在写完数据同时关闭文件之后。在创建一个不存在的文件,在将这个文件删除掉。估计你的问题应该就可以解决了。