謝謝,真是抱歉,我看到生成的文件名也有小數(shù)點(diǎn),就沒想ascII碼錯了,拿著本微機(jī)的書,ascII還出錯,剛才百度了一下,真是感謝,繼續(xù)調(diào)試。
我的FILE_DATA_BUF只有4K的空間,現(xiàn)在要寫8K的數(shù)據(jù),按我自己對例程的理解,寫成如下的程序,可后4k的內(nèi)容寫不進(jìn)去,麻煩各位指點(diǎn)一下,謝謝。 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( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */
for(j = 0; j < 16; j++) { FILE_DATA_BUF[WriteSizeCount] = (j&0x0f) + 0x41; WriteSizeCount++; FILE_DATA_BUF[WriteSizeCount] = 0x20; WriteSizeCount++; for(i = 2; i < 255; i++) { FILE_DATA_BUF[WriteSizeCount] = (i&0x0f) + 0x41; WriteSizeCount++; } FILE_DATA_BUF[WriteSizeCount] = 0x0d; WriteSizeCount++; }
NewSize = 0x2000; /* 新文件的長度 */ SecCount = (NewSize+CH375vSectorSize-1)/CH375vSectorSize; /* (NewSize+CH375vSectorSize-1)/CH375vSectorSize, 計算文件的扇區(qū)數(shù),因為讀寫是以扇區(qū)為單位的 */
mCmdParam.Write.mSectorCount = SecCount; /* 寫入所有扇區(qū)的數(shù)據(jù) */ i = CH375FileWrite( ); /* 向文件寫入數(shù)據(jù) */
mCmdParam.Locate.mSectorOffset = 0xffffffff; //移到文件的尾部,以扇區(qū)為單位,如果原文件是3字節(jié),則從CH375vSectorSize字節(jié)開始添加 i = CH375FileLocate( );
for(j = 0; j < 16; j++) { FILE_DATA_BUF[WriteSizeCount] = (j&0x0f) + 0x61; WriteSizeCount++; FILE_DATA_BUF[WriteSizeCount] = 0x20; WriteSizeCount++; for(i = 2; i < 255; i++) { FILE_DATA_BUF[WriteSizeCount] = (i&0x0f) + 0x61; WriteSizeCount++; } FILE_DATA_BUF[WriteSizeCount] = 0x0d; WriteSizeCount++; }
mCmdParam.Write.mSectorCount = 2; i = CH375FileWrite();
mCmdParam.Modify.mFileAttr = ATTR_ARCHIVE; /* 輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 */ mCmdParam.Modify.mFileTime = MAKE_FILE_TIME(11,0,0); /* 輸入?yún)?shù): 新的文件時間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認(rèn)時間 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2009,8,7 ); /* 輸入?yún)?shù): 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = NewSize; /* 輸入?yún)?shù): 如果原文件較小,那么新的文件長度與原文件一樣長,否則被RAM所限,如果文件長度大于64KB,那么NewSize必須為UINT32 */ i = CH375FileModify( ); /* 修改當(dāng)前文件的信息,修改日期和長度 */
mCmdParam.Close.mUpdateLen = 0; /* 不要自動計算文件長度,如果自動計算,那么該長度總是CH375vSectorSize的倍數(shù) */ i = CH375FileClose( );
不需要跳轉(zhuǎn)函數(shù)的,直接在后面在寫數(shù)據(jù)就可以了。寫完之后關(guān)閉文件。
可以了,謝謝。
請教一下,如果我只需要每次都創(chuàng)建新文件,不需要使用CH375FileLocate、CH375FileReadX這2個庫函數(shù),請問有方法讓其不編譯嗎?
沒有辦法讓其不編譯,即使去掉這2個函數(shù),代碼空間也不會節(jié)省下來。
我寫一個簡單的U盤寫文件程序沒有異常,但我在另一個程序里嵌入庫函數(shù)及頭文件后所有庫函數(shù)的變量都提示multiple public definitions,請問有人遇到類似情況嗎?
多加了頭文件,仔細(xì)檢查工程.
庫的頭文件被多個C文件包含時,除一個C文件外,其他C文件包含頭文件時需這樣做: #define CH375HF_NO_CODE 1 /* 這個宏頭文件中有解釋 */ #include "CH375HF?.H
謝謝,很奇怪,我就只有在主文件之中include了CH375的頭文件,其他C文件都沒有include這個頭文件,可是一樣報錯。
具體是哪些函數(shù)和變量出現(xiàn)錯誤 建議逐步修改,看看是在哪一步出錯的
呵呵,比較多,我再試試。 另外,因為我用查詢方式,中斷口另有用途,所以將 #ifndef NO_DEFAULT_CH375_INT /* 在應(yīng)用程序中定義NO_DEFAULT_CH375_INT可以禁止默認(rèn)的中斷處理程序,然后用自行編寫的程序代替它 */ #if LIB_CFG_INT_EN == 0 /* CH375的INT#引腳連接方式為"查詢方式" */ void xQueryInterrupt( void ) /* 查詢CH375中斷并更新中斷狀態(tài) */ { #ifdef CH375_INT_WIRE /* 查詢中斷引腳 */ while ( CH375_INT_WIRE ); /* 如果CH375的中斷引腳輸出高電平則等待 */ #else /* 對于CH375B芯片還可以查詢命令端口的位7 */ while ( CH375_CMD_PORT & 0x80 ); /* 查詢CH375B的命令端口的位7為1說明中斷引腳輸出高電平則等待 */ #endif CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取當(dāng)前中斷狀態(tài) */ CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; /* 操作無意義,用于至少延時2uS */ CH375IntStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */ if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 檢測到USB設(shè)備斷開事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 檢測到USB設(shè)備連接事件 */ } #else /* LIB_CFG_INT_EN != 0, CH375的INT#引腳連接方式為"中斷方式" */ void xQueryInterrupt( void ) /* 查詢中斷狀態(tài),等待硬件中斷 */ { while ( CH375IntStatus == 0 ); /* 子程序庫調(diào)用該子程序之前CH375IntStatus=0,硬件中斷后,由中斷服務(wù)程序置為非0的實際中斷狀態(tài)后返回 */ } void CH375Interrupt( void ) interrupt CH375_INT_NO using 1 /* CH375中斷服務(wù)程序,使用寄存器組1,由CH375的INT#的低電平或者下降沿觸發(fā)單片機(jī)中斷 */ { CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取中斷狀態(tài)并取消中斷請求 */ CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; /* 操作無意義,用于至少延時2uS */ CH375IntStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */ if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 檢測到USB設(shè)備斷開事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 檢測到USB設(shè)備連接事件 */ #ifdef CLEAR_INT_MARK CLEAR_INT_MARK( ); /* 某些單片機(jī)需要由軟件清除中斷標(biāo)志 */ #endif } #endif #endif
修改為 #ifndef NO_DEFAULT_CH375_INT /* 在應(yīng)用程序中定義NO_DEFAULT_CH375_INT可以禁止默認(rèn)的中斷處理程序,然后用自行編寫的程序代替它 */ #if LIB_CFG_INT_EN == 0 /* CH375的INT#引腳連接方式為"查詢方式" */ void xQueryInterrupt( void ) /* 查詢CH375中斷并更新中斷狀態(tài) */ { #ifdef CH375_INT_WIRE /* 查詢中斷引腳 */ while ( CH375_INT_WIRE ); /* 如果CH375的中斷引腳輸出高電平則等待 */ #else /* 對于CH375B芯片還可以查詢命令端口的位7 */ while ( CH375_CMD_PORT & 0x80 ); /* 查詢CH375B的命令端口的位7為1說明中斷引腳輸出高電平則等待 */ #endif CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取當(dāng)前中斷狀態(tài) */ CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; /* 操作無意義,用于至少延時2uS */ CH375IntStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */ if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 檢測到USB設(shè)備斷開事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 檢測到USB設(shè)備連接事件 */ } #endif
#endif
頭文件的開頭已經(jīng)#define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */
這樣應(yīng)該沒問題吧?
請不要隨意修改庫的頭文件,查詢或中斷方式僅修LIB_CFG_INT_EN即可
麻煩哪位幫忙看一下附件的Keil工程文件,編譯會異常,提示multiple public definitions。
UploadImages/200981015344617.rar 忘點(diǎn)上傳文件了,麻煩哪位幫忙分析下附件的Keil報錯信息。