CH376写SD卡文件,追加数据时,总是自己重复多写数据,为什么啊?

打开文件后,移动文件指针到末尾(0xFFFFFFFF),写一次“12345”,结果出现“1234512345”,再次写入一次,由变成了“1234512345123451234512345”,仿真跟踪查看代码,程序只执行了一次写入,然后返回了写入成功,不知道结果怎么变成了这样???????这芯片到底怎么回事哦????

你写入的数据长度是多少?还有你打开文件之后此文件本身是否有数据?


写“12345",就5个数据,文件本省是有数据的,我是将文件指针移动到文件末尾(偏移0xFFFFFFFF),然后写入,就成上面这样了!!


文件代码如下:

unsigned char CH376_FileOpen(unsigned char *filename) //在根目录或者当前目录下打开文件或者目录(文件夹) { CH376_Set_FileName(filename); //设置要操作的文件(文件夹)名 if( filename[0] == DEF_SEPAR_CHAR1 || filename[0] == DEF_SEPAR_CHAR2 ) { //如果filename的第一个字符为“/"或”\”,说明是根目录文件,需要发送设置CH376芯片内部32位变量(4个字节的0) CH376_Write_Var32( VAR_CURRENT_CLUST, 0 ); } Write_CH376_Cmd(CMD0H_FILE_OPEN); //发送打开文件命令 return(Quer_int()); //返回中断状态 }

unsigned char CH376_ByteLocate( unsigned long offset ) // 以字节为单位移动当前文件指针(offset参数为32位偏移量) { /*****************文件被新建或者被重新打开时,当前文件指针都为0*****************/ /**************移动文件指针到原文件末尾,偏移量可以指定为很大的字节,如:0xFFFFFFFF*********/ Write_CH376_Cmd( CMD4H_BYTE_LOCATE ); Write_CH376_Data( (unsigned char)offset ); Write_CH376_Data( (unsigned char)((unsigned int)offset>>8) ); Write_CH376_Data( (unsigned char)(offset>>16) ); Write_CH376_Data( (unsigned char)(offset>>24) ); dis_CH376(); //禁止CH376 SPI片选 return(Quer_int()); //返回中断状态 }

unsigned char CH376_WriteReqBlock( unsigned char *buf ) //向内部指定缓冲区写入请求的数据块,返回长度 { unsigned char S, L; Write_CH376_Cmd( CMD01_WR_REQ_DATA ); // 发送请求命令 S = L = Read_CH376_Data( ); //返回CH376请求单片机写入的后续数据流的字节数 if ( L ) { do { Write_CH376_Data( *buf ); //写一字节数据 buf ++; } while ( -- L ); } dis_CH376(); //禁止CH376 SPI片选 return( S ); //返回CH376请求单片机写入的后续数据流的字节数 }

unsigned char CH376_ByteWrite(unsigned char *buf, unsigned int ReqCount) //以字节为单位向当前位置写入数据块 { unsigned char s; Write_CH376_Cmd( CMD2H_BYTE_WRITE ); //发送字节方式写命令 Write_CH376_Data( (unsigned char)ReqCount ); //发送请求写入的字节数(低字节) Write_CH376_Data( (unsigned char)(ReqCount>>8) ); //发送请求写入的字节数(高字节) dis_CH376(); //禁止CH376 SPI片选 while ( 1 ) { s = Quer_int(); //读取中断状态 switch (s) { case USB_INT_SUCCESS: { Write_CH376_Cmd(CMD00_DIRTY_BUFFER); //清除内部的磁盘和文件缓冲区 return USB_INT_SUCCESS;break; //返回成功状态 } case USB_INT_DISK_WRITE: //如果返回状态为 “USB存储器请求数据写入 { s = CH376_WriteReqBlock( buf ); //向内部指定缓冲区写入请求的数据块,返回长度 Write_CH376_Cmd( CMD0H_BYTE_WR_GO ); // 发送命令 ”继续字节写操作“ dis_CH376(); //禁止CH376 SPI片选 buf += s; break; } default: return ERR_USB_UNKNOWN; break; //返回其它错误信息 } } }

void main(void) { unsigned char *filename = "/90.TXT\0"; unsigned char *buf = "12345"; unsigned char offset = 0xffffffff;

.........后面依次调用上述函数,完成后关闭文件CH376_fileclolse(); }


unsigned char CH376_ByteWrite(unsigned char *buf, unsigned int ReqCount) 这个函数里面的ReqCount这个变量是多少?


十进制:5


这东西搞了几天了,手册也反复的看了又看,始终找不到原因,,,急死人了~~~~~~~~~~~顺便说一下,前面的初始化这些都是成功了的!!


在线等待中。。。。。。。。。。期待解决。。。。。。。。。。。


怎么没人理了??


我仔细想了一下,后面多出来的数据应该是CH376缓冲区中残留的前次写入的数据,那么如何清除CH376的数据缓冲区呢?


搞什么啊~~~~~~~~都没人理~~~~~~~~什么公司啊,客服太差了吧~~~ 说到一半就没动静了,,,到底解决不解决给个开个腔啊~~~~~~搞什么哦~~~~~~~


清了缓冲区也不行。。。算了。。不指望了。。。改方案得了~~~~~从来没用过这么费力而且诡异的芯片!


我们论坛回帖人的签名处都有电话和邮件的,你可以选择电话或者邮件联系,自己不看好在这发牢骚。


我不满意的是客服的服务态度,说到一半就没不理人了,如果你忙,至少可以说:现在忙,等下回复你,之类的,你们是做技术支持的,又不是网友聊天,说着说着就潜水了~~~~ 还不准别人发牢骚! 以你们这种工作方式,估计老板知道后要哭了!


正确的操作是这样的:把要写的数据放入缓冲区,最好把BUF数据打印出来,看是不是你想写入的数据。接着打开文件,如果把指针移到末尾就是在源文件添加数据,如果指针在文件头,就是覆盖原来文件的数据,接着你调的是BYTEWRITE这个函数,第一个形参是BUF的首地址,第二个是要写入数据的长度,第三个是实际写入数据的长度,写成功后要关闭文件,FILECLOSE(TRUE)来更新文件长度


我们的技术支持不是每时每刻都看网页的,他们也有自己的项目要做、也有自己的客户要见、也有突发的紧急事件,已经很努力在给你们回帖了。如果你急的话可以打电话发邮件,


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