這完全是你的程序的問(wèn)題,在Main.C中定義:#define extern,相當(dāng)于用空代替extern,即定義變量時(shí)有沒(méi)有關(guān)鍵字extern,效果都是一樣,造成庫(kù)頭文件中的變量重定義了。 建議修改程序時(shí)邊修改邊編譯,以免出現(xiàn)問(wèn)題時(shí)無(wú)法回溯
謝謝,我再繼續(xù)調(diào)試,對(duì)C51的偽指令使用不大熟悉。
main( ) { UINT8 i, j, k, SecCount; UINT32 NewSize; /* 因?yàn)檠菔景宓腞AM容量只有32KB,所以NewSize限制為16位,實(shí)際上如果文件大于32256字節(jié),應(yīng)該分幾次讀寫(xiě)并且將NewSize改為UINT32以便累計(jì) */ UINT16 WriteSizeCount; mDelay100mS( ); /* 延時(shí)100毫秒 */
i = CH375LibInit( ); /* 初始化CH375程序庫(kù)和CH375芯片,操作成功返回0 */
while ( 1 ) { while ( CH375DiskStatus < DISK_CONNECT ) { /* 查詢(xún)CH375中斷并更新中斷狀態(tài),等待U盤(pán)插入 */ if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有設(shè)備連接則返回成功,CH375DiskConnect同時(shí)會(huì)更新全局變量CH375DiskStatus */ mDelay100mS( ); } mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */ mDelay100mS( );
/* 檢查U盤(pán)是否準(zhǔn)備好,但是某些U盤(pán)必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盤(pán)總是返回未準(zhǔn)備好,不過(guò)可以被忽略 */ mDelay100mS( ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢(xún)磁盤(pán)是否準(zhǔn)備好 */ }
//文件名20090803.txt mCmdParam.Open.mPathName[0] = 0x5c; mCmdParam.Open.mPathName[1] = 0x32; mCmdParam.Open.mPathName[2] = 0x30; mCmdParam.Open.mPathName[3] = 0x30; mCmdParam.Open.mPathName[4] = 0x39; mCmdParam.Open.mPathName[5] = 0x30; mCmdParam.Open.mPathName[6] = 0x38; mCmdParam.Open.mPathName[7] = 0x30; mCmdParam.Open.mPathName[8] = 0x37; mCmdParam.Open.mPathName[9] = 0x2e; mCmdParam.Open.mPathName[10] = 0x54; mCmdParam.Open.mPathName[11] = 0x58; mCmdParam.Open.mPathName[12] = 0x54;
i = CH375FileCreate( ); /* 新建文件并打開(kāi),如果文件已經(jīng)存在則先刪除后再新建 */
NewSize = 0x19000; /* 新文件的長(zhǎng)度 */ SecCount = (NewSize+CH375vSectorSize-1)/CH375vSectorSize; /* (NewSize+CH375vSectorSize-1)/CH375vSectorSize, 計(jì)算文件的扇區(qū)數(shù),因?yàn)樽x寫(xiě)是以扇區(qū)為單位的 */
mCmdParam.Write.mSectorCount = SecCount; /* 寫(xiě)入所有扇區(qū)的數(shù)據(jù) */
WriteSizeCount = 0; for(j = 0; j < 16; j++) //4k數(shù)據(jù) { FILE_DATA_BUF[WriteSizeCount] = (j&0x0f) + 0x41; WriteSizeCount++; FILE_DATA_BUF[WriteSizeCount] = 0x20; WriteSizeCount++; for(i = 2; i < 254; i++) { FILE_DATA_BUF[WriteSizeCount] = (i&0x0f) + 0x41; WriteSizeCount++; } FILE_DATA_BUF[WriteSizeCount] = 0x0d; WriteSizeCount++; FILE_DATA_BUF[WriteSizeCount] = 0x0a; WriteSizeCount++; } i = CH375FileWrite( ); /* 向文件寫(xiě)入數(shù)據(jù) */ WriteSizeCount = 0;
for(k = 0; k < 12; k++) //12*(4+4)=96k數(shù)據(jù) { for(j = 0; j < 16; j++) //4k數(shù)據(jù) { FILE_DATA_BUF[WriteSizeCount] = (0x0f-(j&0x0f)) + 0x61; WriteSizeCount++; FILE_DATA_BUF[WriteSizeCount] = 0x20; WriteSizeCount++; for(i = 2; i < 254; i++) { FILE_DATA_BUF[WriteSizeCount] = (i&0x0f) + 0x61; WriteSizeCount++; } FILE_DATA_BUF[WriteSizeCount] = 0x0d; WriteSizeCount++; FILE_DATA_BUF[WriteSizeCount] = 0x0a; WriteSizeCount++; } i = CH375FileWrite(); WriteSizeCount = 0; for(j = 0; j < 16; j++) //4k數(shù)據(jù) { FILE_DATA_BUF[WriteSizeCount] = (j&0x0f) + 0x41; WriteSizeCount++; FILE_DATA_BUF[WriteSizeCount] = 0x20; WriteSizeCount++; for(i = 2; i < 254; i++) { FILE_DATA_BUF[WriteSizeCount] = (i&0x0f) + 0x41; WriteSizeCount++; } FILE_DATA_BUF[WriteSizeCount] = 0x0d; WriteSizeCount++; FILE_DATA_BUF[WriteSizeCount] = 0x0a; WriteSizeCount++; } i = CH375FileWrite(); } mCmdParam.Modify.mFileAttr = ATTR_ARCHIVE; /* 輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 */ mCmdParam.Modify.mFileTime = MAKE_FILE_TIME(11,0,0); /* 輸入?yún)?shù): 新的文件時(shí)間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認(rèn)時(shí)間 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2009,8,7 ); /* 輸入?yún)?shù): 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = NewSize; /* 輸入?yún)?shù): 如果原文件較小,那么新的文件長(zhǎng)度與原文件一樣長(zhǎng),否則被RAM所限,如果文件長(zhǎng)度大于64KB,那么NewSize必須為UINT32 */ i = CH375FileModify( ); /* 修改當(dāng)前文件的信息,修改日期和長(zhǎng)度 */
mCmdParam.Close.mUpdateLen = 0; /* 不要自動(dòng)計(jì)算文件長(zhǎng)度,如果自動(dòng)計(jì)算,那么該長(zhǎng)度總是CH375vSectorSize的倍數(shù) */ i = CH375FileClose( ); } }
我想嘗試寫(xiě)100k的數(shù)據(jù)到U盤(pán),可是U盤(pán)得一直閃爍,不能跳過(guò)寫(xiě)100k數(shù)據(jù)部分,麻煩哪位指教一下。
剛才嘗試在每次寫(xiě)數(shù)據(jù)前更新mCmdParam.Write.mSectorCount數(shù)據(jù),我想mCmdParam.Write.mSectorCount對(duì)應(yīng)的是每次實(shí)際寫(xiě)入的扇區(qū)數(shù),而不是總寫(xiě)入的扇區(qū)總數(shù),一開(kāi)始以為是總寫(xiě)入的扇區(qū)總數(shù)。
可是寫(xiě)到最后,在PC查看會(huì)有絮亂的數(shù)據(jù),能幫忙分析一下嗎?
剛數(shù)了一下數(shù)據(jù),最后4k數(shù)據(jù)出現(xiàn)亂碼,哪位指教指教,謝謝。
呵呵,寫(xiě)數(shù)據(jù)之間做了延時(shí)就好了,都解決了。 我想請(qǐng)問(wèn)每次寫(xiě)扇區(qū)大約需要隔多長(zhǎng)時(shí)間?
只要寫(xiě)成功的話應(yīng)該就不會(huì)出現(xiàn)下一次寫(xiě)出錯(cuò)的現(xiàn)象的。也就是說(shuō)不存在寫(xiě)數(shù)據(jù)的時(shí)候有寫(xiě)延時(shí)的說(shuō)法。
好的,我后續(xù)會(huì)繼續(xù)研究調(diào)試。
有人能提供一個(gè)寫(xiě)零星數(shù)據(jù)的例子嗎?我剛才嘗試在1個(gè)扇區(qū)只寫(xiě)入16字節(jié)的數(shù)據(jù),在PC顯示的結(jié)果又異常。
不可以寫(xiě)零碎數(shù)據(jù)的,因?yàn)樵赨盤(pán)低層操作的話最少操作為1個(gè)扇區(qū)為基本單位。如果每次寫(xiě)16個(gè)字節(jié)的話你可以調(diào)用我們字節(jié)方式讀寫(xiě),或者你把多個(gè)16字節(jié)組合起來(lái)滿足512字節(jié)在寫(xiě)數(shù)據(jù)進(jìn)去就可以了。
我想請(qǐng)問(wèn),我用Create函數(shù)創(chuàng)建文件時(shí)無(wú)法將同名文件名先刪除再重建,請(qǐng)問(wèn)是什么原因?謝謝
你首先要確定你的文件名是一樣的這樣的話是肯定可以先刪除在創(chuàng)建的。還有就是你創(chuàng)建的時(shí)候有沒(méi)有給你報(bào)錯(cuò)呢?
不好意思,白天有事,我剛調(diào)試了一下,CH375FileCreate()后的返回值為0x00;文件名是相同的,奇怪的是我生成文件后,再重新CH375FileCreate()同名的文件及寫(xiě)入不同的數(shù)據(jù)就無(wú)法覆蓋原文件,可是在電腦里將文件刪了再重新生成就是新的文件數(shù)據(jù),麻煩幫忙分析一下。
你所說(shuō)的無(wú)法覆蓋原文件是什么意思?我們的庫(kù)創(chuàng)建文件之后會(huì)自動(dòng)更新文件長(zhǎng)度為1個(gè)字節(jié)的。
不知道你程序的流程是怎樣的,下述流程驗(yàn)證過(guò),重新創(chuàng)建可以覆蓋先前的數(shù)據(jù): printf( "Create\n" ); mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); /* 新文件名,在根目錄下 */ i = CH375FileCreate( ); /* 新建文件并打開(kāi),如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); pCodeStr = "12345\xd\n"; for ( i = 0; i != 255; i ++ ) { if ( ( FILE_DATA_BUF[i] = *pCodeStr ) == 0 ) break; pCodeStr++; } NewSize = i; /* 新文件的長(zhǎng)度 */ SecCount = 1; /* (NewSize+CH375vSectorSize-1)/CH375vSectorSize, 計(jì)算文件的扇區(qū)數(shù),因?yàn)樽x寫(xiě)是以扇區(qū)為單位的 */ printf( "Write\n" ); mCmdParam.Write.mSectorCount = SecCount; /* 寫(xiě)入所有扇區(qū)的數(shù)據(jù) */ i = CH375FileWrite( ); /* 向文件寫(xiě)入數(shù)據(jù) */ mStopIfError( i );
printf( "Create\n" ); mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); /* 新文件名,在根目錄下 */ i = CH375FileCreate( ); /* 新建文件并打開(kāi),如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i );
pCodeStr = "56789\xd\n"; for ( i = 0; i != 255; i ++ ) { if ( ( FILE_DATA_BUF[i] = *pCodeStr ) == 0 ) break; pCodeStr++; }
NewSize = i; /* 新文件的長(zhǎng)度 */ SecCount = 1; /* (NewSize+CH375vSectorSize-1)/CH375vSectorSize, 計(jì)算文件的扇區(qū)數(shù),因?yàn)樽x寫(xiě)是以扇區(qū)為單位的 */
printf( "Write\n" ); mCmdParam.Write.mSectorCount = SecCount; /* 寫(xiě)入所有扇區(qū)的數(shù)據(jù) */
i = CH375FileWrite( ); /* 向文件寫(xiě)入數(shù)據(jù) */ mStopIfError( i ); printf( "Modify\n" ); mCmdParam.Modify.mFileAttr = 0xff; /* 輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 */ mCmdParam.Modify.mFileTime = 0xffff; /* 輸入?yún)?shù): 新的文件時(shí)間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認(rèn)時(shí)間 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2004, 5, 18 ); /* 輸入?yún)?shù): 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = NewSize; /* 輸入?yún)?shù): 如果原文件較小,那么新的文件長(zhǎng)度與原文件一樣長(zhǎng),否則被RAM所限,如果文件長(zhǎng)度大于64KB,那么NewSize必須為UINT32 */ i = CH375FileModify( ); /* 修改當(dāng)前文件的信息,修改日期和長(zhǎng)度 */ mStopIfError( i ); printf( "Close\n" ); mCmdParam.Close.mUpdateLen = 0; /* 不要自動(dòng)計(jì)算文件長(zhǎng)度,如果自動(dòng)計(jì)算,那么該長(zhǎng)度總是CH375vSectorSize的倍數(shù) */ i = CH375FileClose( ); mStopIfError( i );
我指的覆蓋是刪除文件后重新創(chuàng)立,早上想到問(wèn)題所在了,因?yàn)槲襌AM區(qū)不夠,我在其他場(chǎng)合也將mCmdParam復(fù)用為數(shù)據(jù)緩沖區(qū)了,現(xiàn)在每次寫(xiě)U盤(pán)前將那一部分RAM清空,現(xiàn)在可以先刪除再生成文件了,謝謝各位的幫忙。