CH376用串口方式給SD卡寫(xiě)數(shù)據(jù),數(shù)據(jù)結(jié)尾處亂碼

你好,我發(fā)現(xiàn)個(gè)怪現(xiàn)象,每次追加數(shù)據(jù)長(zhǎng)度假如是16的整數(shù)倍的話,就不會(huì)出錯(cuò)。否則的話,結(jié)尾處總是有各種亂碼。。。是不是底層字節(jié)對(duì)齊的原因???謝謝了。。。。

首先監(jiān)控一下確保你寫(xiě)入的數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)都是正確的,寫(xiě)完之后需要更新文件長(zhǎng)度。這種現(xiàn)象一般與你程序有關(guān)。


寫(xiě)入的沒(méi)問(wèn)題啊,也更新了長(zhǎng)度了啊,只要追加數(shù)據(jù)長(zhǎng)度假如是16的整數(shù)倍的話,就不會(huì)出任何問(wèn)題。。。想不通為啥是和16有關(guān)系。。。


你把你寫(xiě)入部分的程序貼出來(lái)看一下,我們這邊測(cè)試一下。


//對(duì)N級(jí)目錄下的一個(gè)文件追加數(shù)據(jù),如果該路徑中的哪一級(jí)目錄不存在,會(huì)自動(dòng)創(chuàng)建;如果發(fā)現(xiàn)最后文件也不存在不存在, //那么也是直接創(chuàng)建,并且打開(kāi) 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))//要對(duì)一個(gè)文件操作,首先應(yīng)該打開(kāi)這個(gè)文件,如果路徑下的文件不存在, { //那么先自動(dòng)創(chuàng)建這個(gè)文件,再調(diào)用一次Open_Dir_File則會(huì)打開(kāi)該文件 ack = Open_Dir_File( pFileName, 0); if (ack != 0x00) //成功打開(kāi)文件Open_Dir_File返回0x00 return ack; } CH376ByteLocate(0xFFFFFFFF); numWR = ( dataLen /16 ); //寫(xiě)數(shù)據(jù)塊長(zhǎng)度修改為16,降低存儲(chǔ)速度以避免數(shù)據(jù)存儲(chǔ)錯(cuò)位 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); //只更新文件長(zhǎng)度,但是不關(guān)閉文件 // xWriteCH376Data( 0x00 ); // xWriteCH376Data( 0x00 ); // echo = Wait376Interrupt( ); FEEDWDT; echo = CH376FileClose(0x01 ); //更新文件長(zhǎng)度,并且關(guān)閉文件,一次完整的寫(xiě)入操作完成 return 0; }


UINT16 dataLen這個(gè)長(zhǎng)度 假如剛好是16的整數(shù)倍的話,數(shù)據(jù)就很完美。。。。。謝謝回復(fù)了!


你的程序流程有點(diǎn)問(wèn)題,假如你都是16的倍數(shù)只會(huì)執(zhí)行前面一個(gè)CH376ByteWrite函數(shù),當(dāng)然不會(huì)出問(wèn)題,但是你不是16的倍數(shù),假設(shè)dataLen=17,那么第一個(gè)numWR=1,執(zhí)行第一個(gè)寫(xiě),第一個(gè)offset=16,然后第二個(gè)numWR=1,第二個(gè)offset還是=16,相當(dāng)于第一次和第二次寫(xiě)進(jìn)去的數(shù)據(jù)都是offset便宜16個(gè)字節(jié)的pDataBuf。


不對(duì)啊。假設(shè)dataLen=17,那么第一個(gè)numWR=1, for(iNum=0;iNum執(zhí)行第一個(gè)寫(xiě),第一個(gè) offset = iNum *16 =0啊


&pDataBuf[offset]這個(gè)是取pDataBuf的地址吧


我把offset=iNum *16看成offset = numWR *16了,那你的流程應(yīng)該沒(méi)什么問(wèn)題,具體錯(cuò)誤現(xiàn)象是什么呢?


每次寫(xiě)完數(shù)據(jù)結(jié)尾處有亂碼。。。。感覺(jué)是寫(xiě)進(jìn)去了RAM中的隨機(jī)值。如果把追加長(zhǎng)度擴(kuò)招為16的整數(shù)倍,就沒(méi)有這個(gè)問(wèn)題了。。。謝謝您的回復(fù)了


你看一下每次結(jié)尾處的有亂碼是除以16余下來(lái)的數(shù)據(jù)個(gè)數(shù)嗎?你說(shuō)的這個(gè)16的整數(shù)倍還是跟你的程序或者你的內(nèi)存分配有關(guān)系,因?yàn)槟愠绦蛑袑?duì)16這個(gè)數(shù)值有特殊處理,你再好好檢查一下。


是的。以前按28分塊存儲(chǔ)的時(shí)候,也有這個(gè)問(wèn)題,現(xiàn)在修改成16只是存儲(chǔ)變慢,解決了存儲(chǔ)錯(cuò)位的問(wèn)題......仿真器連接看內(nèi)存分配也沒(méi)有問(wèn)題啊


大神,能給我程序么,我在編這個(gè)程序,菜鳥(niǎo)不會(huì)啊個(gè)人信息保護(hù),已隱藏


如果最后寫(xiě)有問(wèn)題說(shuō)明最后一次沒(méi)有寫(xiě)入到U盤去了,但是U盤并沒(méi)有寫(xiě)入到U盤的FLASH里面去。建議你在寫(xiě)完數(shù)據(jù)同時(shí)關(guān)閉文件之后。在創(chuàng)建一個(gè)不存在的文件,在將這個(gè)文件刪除掉。估計(jì)你的問(wèn)題應(yīng)該就可以解決了。


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频