打開文件后,移動文件指針到末尾(0xFFFFFFFF),寫一次“12345”,結(jié)果出現(xiàn)“1234512345”,再次寫入一次,由變成了“1234512345123451234512345”,仿真跟蹤查看代碼,程序只執(zhí)行了一次寫入,然后返回了寫入成功,不知道結(jié)果怎么變成了這樣???????這芯片到底怎么回事哦????
你寫入的數(shù)據(jù)長度是多少?還有你打開文件之后此文件本身是否有數(shù)據(jù)?
寫“12345",就5個數(shù)據(jù),文件本省是有數(shù)據(jù)的,我是將文件指針移動到文件末尾(偏移0xFFFFFFFF),然后寫入,就成上面這樣了?。?/p>
文件代碼如下:
unsigned char CH376_FileOpen(unsigned char *filename) //在根目錄或者當(dāng)前目錄下打開文件或者目錄(文件夾) { CH376_Set_FileName(filename); //設(shè)置要操作的文件(文件夾)名 if( filename[0] == DEF_SEPAR_CHAR1 || filename[0] == DEF_SEPAR_CHAR2 ) { //如果filename的第一個字符為“/"或”\”,說明是根目錄文件,需要發(fā)送設(shè)置CH376芯片內(nèi)部32位變量(4個字節(jié)的0) CH376_Write_Var32( VAR_CURRENT_CLUST, 0 ); } Write_CH376_Cmd(CMD0H_FILE_OPEN); //發(fā)送打開文件命令 return(Quer_int()); //返回中斷狀態(tài) }
unsigned char CH376_ByteLocate( unsigned long offset ) // 以字節(jié)為單位移動當(dāng)前文件指針(offset參數(shù)為32位偏移量) { /*****************文件被新建或者被重新打開時,當(dāng)前文件指針都為0*****************/ /**************移動文件指針到原文件末尾,偏移量可以指定為很大的字節(jié),如: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()); //返回中斷狀態(tài) }
unsigned char CH376_WriteReqBlock( unsigned char *buf ) //向內(nèi)部指定緩沖區(qū)寫入請求的數(shù)據(jù)塊,返回長度 { unsigned char S, L; Write_CH376_Cmd( CMD01_WR_REQ_DATA ); // 發(fā)送請求命令 S = L = Read_CH376_Data( ); //返回CH376請求單片機寫入的后續(xù)數(shù)據(jù)流的字節(jié)數(shù) if ( L ) { do { Write_CH376_Data( *buf ); //寫一字節(jié)數(shù)據(jù) buf ++; } while ( -- L ); } dis_CH376(); //禁止CH376 SPI片選 return( S ); //返回CH376請求單片機寫入的后續(xù)數(shù)據(jù)流的字節(jié)數(shù) }
unsigned char CH376_ByteWrite(unsigned char *buf, unsigned int ReqCount) //以字節(jié)為單位向當(dāng)前位置寫入數(shù)據(jù)塊 { unsigned char s; Write_CH376_Cmd( CMD2H_BYTE_WRITE ); //發(fā)送字節(jié)方式寫命令 Write_CH376_Data( (unsigned char)ReqCount ); //發(fā)送請求寫入的字節(jié)數(shù)(低字節(jié)) Write_CH376_Data( (unsigned char)(ReqCount>>8) ); //發(fā)送請求寫入的字節(jié)數(shù)(高字節(jié)) dis_CH376(); //禁止CH376 SPI片選 while ( 1 ) { s = Quer_int(); //讀取中斷狀態(tài) switch (s) { case USB_INT_SUCCESS: { Write_CH376_Cmd(CMD00_DIRTY_BUFFER); //清除內(nèi)部的磁盤和文件緩沖區(qū) return USB_INT_SUCCESS;break; //返回成功狀態(tài) } case USB_INT_DISK_WRITE: //如果返回狀態(tài)為 “USB存儲器請求數(shù)據(jù)寫入 { s = CH376_WriteReqBlock( buf ); //向內(nèi)部指定緩沖區(qū)寫入請求的數(shù)據(jù)塊,返回長度 Write_CH376_Cmd( CMD0H_BYTE_WR_GO ); // 發(fā)送命令 ”繼續(xù)字節(jié)寫操作“ 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;
.........后面依次調(diào)用上述函數(shù),完成后關(guān)閉文件CH376_fileclolse(); }
unsigned char CH376_ByteWrite(unsigned char *buf, unsigned int ReqCount) 這個函數(shù)里面的ReqCount這個變量是多少?
十進制:5
這東西搞了幾天了,手冊也反復(fù)的看了又看,始終找不到原因,,,急死人了~~~~~~~~~~~順便說一下,前面的初始化這些都是成功了的??!
在線等待中。。。。。。。。。。期待解決。。。。。。。。。。。
怎么沒人理了??
我仔細想了一下,后面多出來的數(shù)據(jù)應(yīng)該是CH376緩沖區(qū)中殘留的前次寫入的數(shù)據(jù),那么如何清除CH376的數(shù)據(jù)緩沖區(qū)呢?
搞什么啊~~~~~~~~都沒人理~~~~~~~~什么公司啊,客服太差了吧~~~ 說到一半就沒動靜了,,,到底解決不解決給個開個腔啊~~~~~~搞什么哦~~~~~~~
清了緩沖區(qū)也不行。。。算了。。不指望了。。。改方案得了~~~~~從來沒用過這么費力而且詭異的芯片!
我們論壇回帖人的簽名處都有電話和郵件的,你可以選擇電話或者郵件聯(lián)系,自己不看好在這發(fā)牢騷。
我不滿意的是客服的服務(wù)態(tài)度,說到一半就沒不理人了,如果你忙,至少可以說:現(xiàn)在忙,等下回復(fù)你,之類的,你們是做技術(shù)支持的,又不是網(wǎng)友聊天,說著說著就潛水了~~~~ 還不準(zhǔn)別人發(fā)牢騷! 以你們這種工作方式,估計老板知道后要哭了!
正確的操作是這樣的:把要寫的數(shù)據(jù)放入緩沖區(qū),最好把BUF數(shù)據(jù)打印出來,看是不是你想寫入的數(shù)據(jù)。接著打開文件,如果把指針移到末尾就是在源文件添加數(shù)據(jù),如果指針在文件頭,就是覆蓋原來文件的數(shù)據(jù),接著你調(diào)的是BYTEWRITE這個函數(shù),第一個形參是BUF的首地址,第二個是要寫入數(shù)據(jù)的長度,第三個是實際寫入數(shù)據(jù)的長度,寫成功后要關(guān)閉文件,F(xiàn)ILECLOSE(TRUE)來更新文件長度
我們的技術(shù)支持不是每時每刻都看網(wǎng)頁的,他們也有自己的項目要做、也有自己的客戶要見、也有突發(fā)的緊急事件,已經(jīng)很努力在給你們回帖了。如果你急的話可以打電話發(fā)郵件,