電腦上打不開U盤中的文件(ch375寫入的.TXT)

我用ch375a往u盤中寫入.TXT文件,采用ch375hf4.lib,采用扇區(qū)讀寫模式,但在電腦上可見該文件,文件大小時(shí)間都對(duì),但打不開,也復(fù)制不了,用ch375的CH375FileRead也打不開,不知為什么,望指教。

大家?guī)蛶臀野?,俺是新手,鬧心中


創(chuàng)建的文件名要符合DOS規(guī)范,8+3格式,并且都要大寫,還有庫4支持FAT12/FAT16,在寫文件之前要將U盤格成FAT12/FAT16


這個(gè)應(yīng)該是的程序上面的問題,能創(chuàng)建文件的話,那就說明你的磁盤緩沖區(qū)以及變量的設(shè)置都是成功的,不能往里面寫數(shù)據(jù)的話,那么,你看下你的文件緩沖區(qū)的定義正確不正確,以及你的數(shù)據(jù)有沒有往文件緩沖區(qū)里面復(fù)制等等


文件名應(yīng)該沒問題,我特別注意了U盤是在windows下用FAT格式化的 不是FAT32


這是我的完整程序,就是想把文本寫入u盤中,電腦能讀出來,能復(fù)制,現(xiàn)在寫的數(shù)是試試編的好不好使

#include #include #include

//關(guān)于中斷的宏定義 #define LIB_CFG_INT_EN 0 //CH375為查詢方式 #define CH375_INT_NO 1 //CH375中斷號(hào)為INT1 #define CH375_INT_FLAG IE1 // IE1,CH375中斷標(biāo)志 #define CH375_INT_EN EX1 //EX1,CH375中斷允許位 #define CH375_INT_WIRE INT1

//文件的讀寫方式設(shè)定 #define LIB_CFG_DISK_IO 3 //磁盤讀寫的數(shù)據(jù)的復(fù)制方式,3為"單DPTR和P2+R0復(fù)制" #define LIB_CFG_FILE_IO 3 // 文件讀寫的數(shù)據(jù)的復(fù)制方式,3為"單DPTR和P2+R0復(fù)制"

//命令口和數(shù)據(jù)口 #define CH375_CMD_PORT_ADDR 0xB001 //CH375命令端口的地址為B001 #define CH375_DAT_PORT_ADDR 0xB000 //CH375數(shù)據(jù)端口的地址為B000

//緩沖區(qū)定位,62256為32K,定4000H-41FFH為DISK-BASE-BUF(512字節(jié)) // 定4200H-7FFFH為FILE-DATA-BUF(共15872字節(jié),31個(gè)扇區(qū))

#define DISK_BASE_BUF_ADDR 0x4000 //外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長(zhǎng)度為SECTOR_SIZE #define FILE_DATA_BUF_ADDR 0x4200 //外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長(zhǎng)度不小于一次讀寫的數(shù)據(jù)長(zhǎng)度 #define FILE_DATA_BUF_LEN 0x3E00 //外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長(zhǎng)度為31個(gè)扇區(qū),15872個(gè)字節(jié)

//為節(jié)省代碼,禁止程序中不用的函數(shù) #define NO_DEFAULT_CH375_F_ENUM 1 //未調(diào)用枚舉函數(shù)CH375FileEnumer程序 #define NO_DEFAULT_CH375_F_QUERY 1 // 未調(diào)用詢問函數(shù)CH375FileQuery程序

#include"CH375HF4.H"

//聲明外部變量ERROR; extern UINT8 ERROR;//錯(cuò)誤字節(jié) extern bit USB_ERROR;//ERROR的第6位表示USB錯(cuò);

sbit reset=P1^6;

UINT16 FILESIZE=256;//文件中的字節(jié)數(shù),文件較大時(shí)(大于15872個(gè)字節(jié)),一次寫入的扇區(qū)數(shù)為31,寫入長(zhǎng)度為FILE_DATA_BUF_LEN, //共需調(diào)用FILESIZE/FILE_DATA_BUF_LEN次,每次文件長(zhǎng)度為15872個(gè)字節(jié),最后不滿31個(gè)扇區(qū)的數(shù)據(jù),共有FILESIZE%FILE_DATA_BUF_LEN字節(jié), //最后寫入的扇區(qū)數(shù)為((FILESIZE%FILE_DATA_BUF_LEN)+511)/512扇區(qū),文件長(zhǎng)度為(UINT16 )FILESIZE%FILE_DATA_BUF_LEN //文件長(zhǎng)度較小時(shí)(小于15872個(gè)字節(jié)),只需調(diào)用一次,寫入的扇區(qū)數(shù)為(FILESIZE+511)/512扇區(qū)文件長(zhǎng)度為(UINT16 ) //FILESIZE%FILE_DATA_BUF_LEN UINT16 YEAR,MONTH,DAY;

//出錯(cuò)處理,置位出錯(cuò)標(biāo)志 void erusb(UINT8 i) {if(i!=0) USB_ERROR=1; else return; } //延時(shí)100毫秒 void delay100ms(){ UINT8 i,j,k; for(i=0;i<200;i++) for(j=0;j<200;j++) k+=3;}

//向新文件中寫入數(shù)據(jù)(多次調(diào)用) void write(UINT8 seccount) { mCmdParam.WriteX.mSectorCount = seccount; //寫入扇區(qū)數(shù) mCmdParam.WriteX.mDataBuffer=&FILE_DATA_BUF[0];//緩沖區(qū)啟始地址 CH375FileWriteX( ); //以扇區(qū)為單位向文件寫入數(shù)據(jù) }

void datainbuf() {UINT16 i; for(i=0;i FILE_DATA_BUF[i]='b'; FILE_DATA_BUF[FILESIZE]='\0';}

void main()

{ UINT8 state; UINT8 ready_wait,seccount;//寫入的扇區(qū)數(shù) UINT16 addsize;//增加的文件長(zhǎng)度 UINT16 newsize; YEAR=2007; MONTH=5; DAY=1;

USB_ERROR=0; addsize=0; reset=1; delay100ms(); reset=0;

datainbuf();

state=CH375LibInit( ); erusb(state); while(1){ while(CH375DiskStatus!=DISK_CONNECT) xQueryInterrupt( ); delay100ms(); //查詢磁盤是否準(zhǔn)備好 for(ready_wait=6;ready_wait!=0;ready_wait--) {delay100ms(); state=CH375DiskReady(); if(state==ERR_SUCCESS) break;} //狀態(tài)位USB_DISK_DISCONNECT置1,U盤沒連上

//打開文件 strcpy( mCmdParam.Open.mPathName, "\\DATA.TXT" ); //文件名,該文件在根目錄下 state=CH375FileOpen( ); //打開文件 //找到文件.文件MDADTA.TXT尾部定位 if(state==0) // 找到文件 { mCmdParam.Locate.mSectorOffset = 0xffffffff; //移動(dòng)文件指針到文件末尾 CH375FileLocate(); }//移動(dòng)文件指針,以便在原文件的末尾追加數(shù)據(jù)

//沒找到文件,創(chuàng)建新文件并寫入數(shù)據(jù) else if(state==ERR_MISS_FILE)//沒找到文件,創(chuàng)建新文件并寫入數(shù)據(jù) { strcpy( mCmdParam.Create.mPathName, "\\DATA.TXT" ); //創(chuàng)建新文件,在根目錄下 state=CH375FileCreate( ); //新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 erusb(state);} //定扇區(qū)數(shù),寫入數(shù)據(jù) while(FILESIZE>=FILE_DATA_BUF_LEN) {seccount=FILE_DATA_BUF_LEN/512; write(seccount); FILESIZE-=FILE_DATA_BUF_LEN; addsize=addsize+FILE_DATA_BUF_LEN;}

seccount=(FILESIZE+ 511 )>>9; addsize=addsize+(UINT16)FILESIZE; write(seccount) ; //最后寫入的扇區(qū)數(shù)為seccount,寫入的長(zhǎng)度為newsize; //修改文件長(zhǎng)度,文件時(shí)間等 newsize=CH375vFileSize+addsize; 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(YEAR,MONTH, DAY); //輸入?yún)?shù): 新的文件日期 mCmdParam.Modify.mFileSize = newsize; // 輸入?yún)?shù): 如果原文件較小,那么新的文件長(zhǎng)度與原文件一樣長(zhǎng),否則被RAM所限,如果文件長(zhǎng)度大于64KB,那么NewSize必須為UINT32 state= CH375FileModify(); //修改當(dāng)前文件的信息,修改日期和長(zhǎng)度 erusb(state); mCmdParam.Close.mUpdateLen = 0; // 不要自動(dòng)計(jì)算文件長(zhǎng)度,如果自動(dòng)計(jì)算,那么該長(zhǎng)度總是512的倍數(shù) state=CH375FileClose( );//長(zhǎng)度更新 erusb(state); //打開文件讀數(shù)據(jù) strcpy(mCmdParam.Open.mPathName,"\\DATA.TXT") ; state=CH375FileOpen( ); if ( state == ERR_MISS_DIR || state== ERR_MISS_FILE ) USB_ERROR=1; else if ( CH375vFileSize > FILE_DATA_BUF_LEN ) { /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以只讀取不超過63個(gè)扇區(qū),也就是不超過32256字節(jié) */ seccount = FILE_DATA_BUF_LEN / 512; /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以只讀取不超過63個(gè)扇區(qū),也就是不超過32256字節(jié) */ newsize= FILE_DATA_BUF_LEN; /* 由于RAM有限所以限制長(zhǎng)度 */ } else { /* 如果原文件較小,那么使用原長(zhǎng)度 */ seccount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 計(jì)算文件的扇區(qū)數(shù),因?yàn)樽x寫是以扇區(qū)為單位的,先加511是為了讀出文件尾部不足1個(gè)扇區(qū)的部分 */ newsize = (UINT16)CH375vFileSize; /* 原文件的長(zhǎng)度 */ } mCmdParam.Read.mSectorCount = seccount; /* 讀取全部數(shù)據(jù),如果超過60個(gè)扇區(qū)則只讀取60個(gè)扇區(qū) */

CH375vFileSize += 511; /* 默認(rèn)情況下,以扇區(qū)方式讀取數(shù)據(jù)時(shí),無法讀出文件尾部不足1個(gè)扇區(qū)的部分,所以必須臨時(shí)加大文件長(zhǎng)度以讀取尾部零頭 */ state = CH375FileRead( ); /* 從文件讀取數(shù)據(jù) */ CH375vFileSize -= 511; /* 恢復(fù)原文件長(zhǎng)度 */ erusb( state );}}


你可以把你的程序帖出來或是發(fā)到我們技術(shù)信箱,我們看一下是不是程序的讀寫方面有問題。


看的清嗎,看不清我在重貼一下


重貼 #include #include #include

//關(guān)于中斷的宏定義 #define LIB_CFG_INT_EN 0 //CH375為查詢方式 #define CH375_INT_NO 1 //CH375中斷號(hào)為INT1 #define CH375_INT_FLAG IE1 // IE1,CH375中斷標(biāo)志 #define CH375_INT_EN EX1 //EX1,CH375中斷允許位 #define CH375_INT_WIRE INT1

//文件的讀寫方式設(shè)定 #define LIB_CFG_DISK_IO 3 //磁盤讀寫的數(shù)據(jù)的復(fù)制方式,3為"單DPTR和P2+R0復(fù)制" #define LIB_CFG_FILE_IO 3 // 文件讀寫的數(shù)據(jù)的復(fù)制方式,3為"單DPTR和P2+R0復(fù)制"

//命令口和數(shù)據(jù)口 #define CH375_CMD_PORT_ADDR 0xB001 //CH375命令端口的地址為B001 #define CH375_DAT_PORT_ADDR 0xB000 //CH375數(shù)據(jù)端口的地址為B000

//緩沖區(qū)定位,62256為32K,定0000H-3FFFH為全局變量,定4000H-41FFH為DISK-BASE-BUF(512字節(jié)) // 定4200H-7FFFH為FILE-DATA-BUF(共15872字節(jié),31個(gè)扇區(qū))

#define DISK_BASE_BUF_ADDR 0x4000 //外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長(zhǎng)度為SECTOR_SIZE #define FILE_DATA_BUF_ADDR 0x4200 //外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長(zhǎng)度不小于一次讀寫的數(shù)據(jù)長(zhǎng)度 #define FILE_DATA_BUF_LEN 0x3E00 //外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長(zhǎng)度為31個(gè)扇區(qū),15872個(gè)字節(jié)

//為節(jié)省代碼,禁止程序中不用的函數(shù) #define NO_DEFAULT_CH375_F_ENUM 1 //未調(diào)用枚舉函數(shù)CH375FileEnumer程序 #define NO_DEFAULT_CH375_F_QUERY 1 // 未調(diào)用詢問函數(shù)CH375FileQuery程序

#include"CH375HF4.H"

//聲明外部變量ERROR; extern UINT8 ERROR;//錯(cuò)誤字節(jié) extern bit USB_ERROR;//ERROR的第6位表示USB錯(cuò);

sbit reset=P1^6;

UINT16 FILESIZE=256;//文件中的字節(jié)數(shù),文件較大時(shí)(大于15872個(gè)字節(jié)),一次寫入的扇區(qū)數(shù)為31,寫入長(zhǎng)度為FILE_DATA_BUF_LEN, //共需調(diào)用FILESIZE/FILE_DATA_BUF_LEN次,每次文件長(zhǎng)度為15872個(gè)字節(jié),最后不滿31個(gè)扇區(qū)的數(shù)據(jù),共有FILESIZE%FILE_DATA_BUF_LEN字節(jié), //最后寫入的扇區(qū)數(shù)為((FILESIZE%FILE_DATA_BUF_LEN)+511)/512扇區(qū),文件長(zhǎng)度為(UINT16 )FILESIZE%FILE_DATA_BUF_LEN //文件長(zhǎng)度較小時(shí)(小于15872個(gè)字節(jié)),只需調(diào)用一次,寫入的扇區(qū)數(shù)為(FILESIZE+511)/512扇區(qū)文件長(zhǎng)度為(UINT16 ) //FILESIZE%FILE_DATA_BUF_LEN UINT16 YEAR,MONTH,DAY;

//出錯(cuò)處理,置位出錯(cuò)標(biāo)志 void erusb(UINT8 i) {if(i!=0) USB_ERROR=1; else return; }

void delay100ms(){ UINT8 i,j,k; for(i=0;i<200;i++) for(j=0;j<200;j++) k+=3;}

//向新文件中寫入數(shù)據(jù)(多次調(diào)用) void write(UINT8 seccount) { mCmdParam.WriteX.mSectorCount = seccount; //寫入扇區(qū)數(shù) mCmdParam.WriteX.mDataBuffer=&FILE_DATA_BUF[0];//緩沖區(qū)啟始地址 CH375FileWriteX( ); //以扇區(qū)為單位向文件寫入數(shù)據(jù) }

void datainbuf() {UINT16 i; for(i=0;i FILE_DATA_BUF[i]='b'; FILE_DATA_BUF[FILESIZE]='\0';}

void main()

{ UINT8 state; UINT8 ready_wait,seccount;//寫入的扇區(qū)數(shù) UINT16 addsize;//增加的文件長(zhǎng)度 UINT16 newsize; YEAR=2007; MONTH=5; DAY=1;

USB_ERROR=0; addsize=0; reset=1; delay100ms(); reset=0;

datainbuf();

state=CH375LibInit( ); erusb(state); while(1){ while(CH375DiskStatus!=DISK_CONNECT) xQueryInterrupt( ); delay100ms(); //查詢磁盤是否準(zhǔn)備好 for(ready_wait=6;ready_wait!=0;ready_wait--) {delay100ms(); state=CH375DiskReady(); if(state==ERR_SUCCESS) break;} //狀態(tài)位USB_DISK_DISCONNECT置1,U盤沒連上

//打開文件 strcpy( mCmdParam.Open.mPathName, "\\DATA.TXT" ); //文件名,該文件在根目錄下 state=CH375FileOpen( ); //打開文件 //找到文件.文件MDADTA.TXT尾部定位 if(state==0) // 找到文件 { mCmdParam.Locate.mSectorOffset = 0xffffffff; //移動(dòng)文件指針到文件末尾 CH375FileLocate(); }//移動(dòng)文件指針,以便在原文件的末尾追加數(shù)據(jù)

//沒找到文件,創(chuàng)建新文件并寫入數(shù)據(jù) else if(state==ERR_MISS_FILE)//沒找到文件,創(chuàng)建新文件并寫入數(shù)據(jù) { strcpy( mCmdParam.Create.mPathName, "\\DATA.TXT" ); //創(chuàng)建新文件,在根目錄下 state=CH375FileCreate( ); //新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 erusb(state);} //定扇區(qū)數(shù),寫入數(shù)據(jù) while(FILESIZE>=FILE_DATA_BUF_LEN) {seccount=FILE_DATA_BUF_LEN/512; write(seccount); FILESIZE-=FILE_DATA_BUF_LEN; addsize=addsize+FILE_DATA_BUF_LEN;}

seccount=(FILESIZE+ 511 )>>9; addsize=addsize+(UINT16)FILESIZE; write(seccount) ; //最后寫入的扇區(qū)數(shù)為seccount,寫入的長(zhǎng)度為newsize; //修改文件長(zhǎng)度,文件時(shí)間等 newsize=CH375vFileSize+addsize; 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(YEAR, MONTH, DAY); //輸入?yún)?shù): 新的文件日期 mCmdParam.Modify.mFileSize = newsize; // 輸入?yún)?shù): 如果原文件較小,那么新的文件長(zhǎng)度與原文件一樣長(zhǎng),否則被RAM所限,如果文件長(zhǎng)度大于64KB,那么NewSize必須為UINT32 state= CH375FileModify(); //修改當(dāng)前文件的信息,修改日期和長(zhǎng)度 erusb(state); mCmdParam.Close.mUpdateLen = 0; // 不要自動(dòng)計(jì)算文件長(zhǎng)度,如果自動(dòng)計(jì)算,那么該長(zhǎng)度總是512的倍數(shù) state=CH375FileClose( );//長(zhǎng)度更新 erusb(state); //打開文件讀數(shù)據(jù) strcpy(mCmdParam.Open.mPathName,"\\DATA.TXT") ; state=CH375FileOpen( ); if ( state == ERR_MISS_DIR || state== ERR_MISS_FILE ) USB_ERROR=1; else if ( CH375vFileSize > FILE_DATA_BUF_LEN ) { /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以只讀取不超過63個(gè)扇區(qū),也就是不超過32256字節(jié) */ seccount = FILE_DATA_BUF_LEN / 512; /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以只讀取不超過63個(gè)扇區(qū),也就是不超過32256字節(jié) */ newsize= FILE_DATA_BUF_LEN; /* 由于RAM有限所以限制長(zhǎng)度 */ } else { /* 如果原文件較小,那么使用原長(zhǎng)度 */ seccount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 計(jì)算文件的扇區(qū)數(shù),因?yàn)樽x寫是以扇區(qū)為單位的,先加511是為了讀出文件尾部不足1個(gè)扇區(qū)的部分 */ newsize = (UINT16)CH375vFileSize; /* 原文件的長(zhǎng)度 */ } mCmdParam.Read.mSectorCount = seccount; /* 讀取全部數(shù)據(jù),如果超過60個(gè)扇區(qū)則只讀取60個(gè)扇區(qū) */

CH375vFileSize += 511; /* 默認(rèn)情況下,以扇區(qū)方式讀取數(shù)據(jù)時(shí),無法讀出文件尾部不足1個(gè)扇區(qū)的部分,所以必須臨時(shí)加大文件長(zhǎng)度以讀取尾部零頭 */ state = CH375FileRead( ); /* 從文件讀取數(shù)據(jù) */ CH375vFileSize -= 511; /* 恢復(fù)原文件長(zhǎng)度 */ erusb( state );}}


你用下面的程序試下: #include #include #include

//關(guān)于中斷的宏定義 #define LIB_CFG_INT_EN 0 //CH375為查詢方式 #define CH375_INT_NO 1 //CH375中斷號(hào)為INT1 #define CH375_INT_FLAG IE1 // IE1,CH375中斷標(biāo)志 #define CH375_INT_EN EX1 //EX1,CH375中斷允許位 #define CH375_INT_WIRE INT1

//文件的讀寫方式設(shè)定 #define LIB_CFG_DISK_IO 3 //磁盤讀寫的數(shù)據(jù)的復(fù)制方式,3為"單DPTR和P2+R0復(fù)制" #define LIB_CFG_FILE_IO 3 // 文件讀寫的數(shù)據(jù)的復(fù)制方式,3為"單DPTR和P2+R0復(fù)制"

//命令口和數(shù)據(jù)口 #define CH375_CMD_PORT_ADDR 0xB001 //CH375命令端口的地址為B001 #define CH375_DAT_PORT_ADDR 0xB000 //CH375數(shù)據(jù)端口的地址為B000

//緩沖區(qū)定位,62256為32K,定0000H-3FFFH為全局變量,定4000H-41FFH為DISK-BASE-BUF(512字節(jié)) // 定4200H-7FFFH為FILE-DATA-BUF(共15872字節(jié),31個(gè)扇區(qū))

#define DISK_BASE_BUF_ADDR 0x4000 //外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長(zhǎng)度為SECTOR_SIZE #define FILE_DATA_BUF_ADDR 0x4200 //外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長(zhǎng)度不小于一次讀寫的數(shù)據(jù)長(zhǎng)度 #define FILE_DATA_BUF_LEN 0x3E00 //外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長(zhǎng)度為31個(gè)扇區(qū),15872個(gè)字節(jié)

//為節(jié)省代碼,禁止程序中不用的函數(shù) #define NO_DEFAULT_CH375_F_ENUM 1 //未調(diào)用枚舉函數(shù)CH375FileEnumer程序 #define NO_DEFAULT_CH375_F_QUERY 1 // 未調(diào)用詢問函數(shù)CH375FileQuery程序

#include"CH375HF4.H"

//聲明外部變量ERROR; extern UINT8 ERROR;//錯(cuò)誤字節(jié) extern bit USB_ERROR;//ERROR的第6位表示USB錯(cuò);

sbit reset=P1^6;

UINT16 FILESIZE=256;//文件中的字節(jié)數(shù),文件較大時(shí)(大于15872個(gè)字節(jié)),一次寫入的扇區(qū)數(shù)為31,寫入長(zhǎng)度為FILE_DATA_BUF_LEN, //共需調(diào)用FILESIZE/FILE_DATA_BUF_LEN次,每次文件長(zhǎng)度為15872個(gè)字節(jié),最后不滿31個(gè)扇區(qū)的數(shù)據(jù),共有FILESIZE%FILE_DATA_BUF_LEN字節(jié), //最后寫入的扇區(qū)數(shù)為((FILESIZE%FILE_DATA_BUF_LEN)+511)/512扇區(qū),文件長(zhǎng)度為(UINT16 )FILESIZE%FILE_DATA_BUF_LEN //文件長(zhǎng)度較小時(shí)(小于15872個(gè)字節(jié)),只需調(diào)用一次,寫入的扇區(qū)數(shù)為(FILESIZE+511)/512扇區(qū)文件長(zhǎng)度為(UINT16 ) //FILESIZE%FILE_DATA_BUF_LEN UINT16 YEAR,MONTH,DAY;

//出錯(cuò)處理,置位出錯(cuò)標(biāo)志 void erusb(UINT8 i) {if(i!=0) USB_ERROR=1; else return; }

void delay100ms(){ UINT8 i,j,k; for(i=0;i<200;i++) for(j=0;j<200;j++) k+=3;}

//向新文件中寫入數(shù)據(jù)(多次調(diào)用) void write(UINT8 seccount) { mCmdParam.WriteX.mSectorCount = seccount; //寫入扇區(qū)數(shù) mCmdParam.WriteX.mDataBuffer=&FILE_DATA_BUF[0];//緩沖區(qū)啟始地址 CH375FileWriteX( ); //以扇區(qū)為單位向文件寫入數(shù)據(jù) }

void datainbuf() {UINT16 i; for(i=0;i FILE_DATA_BUF='b'; FILE_DATA_BUF[FILESIZE]='\0';}

void main()

{ UINT8 state; UINT8 ready_wait,seccount;//寫入的扇區(qū)數(shù) UINT16 addsize;//增加的文件長(zhǎng)度 UINT16 newsize; YEAR=2007; MONTH=5; DAY=1;

USB_ERROR=0; addsize=0; reset=1; delay100ms(); reset=0;

datainbuf();

state=CH375LibInit( ); erusb(state); while(1){ while(CH375DiskStatus!=DISK_CONNECT) xQueryInterrupt( ); delay100ms(); //查詢磁盤是否準(zhǔn)備好 for(ready_wait=6;ready_wait!=0;ready_wait--) {delay100ms(); state=CH375DiskReady(); if(state==ERR_SUCCESS) break;} //狀態(tài)位USB_DISK_DISCONNECT置1,U盤沒連上

//打開文件 strcpy( mCmdParam.Open.mPathName, "\\DATA.TXT" ); //文件名,該文件在根目錄下 state=CH375FileOpen( ); //打開文件 //找到文件.文件MDADTA.TXT尾部定位 if(state==0) // 找到文件 { newsize=CH375vFileSize; /* 找到文件將文件長(zhǎng)度保存 */ mCmdParam.Locate.mSectorOffset = 0xffffffff; //移動(dòng)文件指針到文件末尾 CH375FileLocate(); }//移動(dòng)文件指針,以便在原文件的末尾追加數(shù)據(jù)

//沒找到文件,創(chuàng)建新文件并寫入數(shù)據(jù) else if(state==ERR_MISS_FILE)//沒找到文件,創(chuàng)建新文件并寫入數(shù)據(jù) { strcpy( mCmdParam.Create.mPathName, "\\DATA.TXT" ); //創(chuàng)建新文件,在根目錄下 state=CH375FileCreate( ); //新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 erusb(state);} //定扇區(qū)數(shù),寫入數(shù)據(jù) while(FILESIZE>=FILE_DATA_BUF_LEN) {seccount=FILE_DATA_BUF_LEN/512; write(seccount); FILESIZE-=FILE_DATA_BUF_LEN; addsize=addsize+FILE_DATA_BUF_LEN;}

seccount=(FILESIZE+ 511 )>>9; addsize=addsize+(UINT16)FILESIZE; write(seccount) //最后寫入的扇區(qū)數(shù)為seccount,寫入的長(zhǎng)度為newsize; //修改文件長(zhǎng)度,文件時(shí)間等 newsize=CH375vFileSize+addsize; 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(YEAR, MONTH, DAY); //輸入?yún)?shù): 新的文件日期 mCmdParam.Modify.mFileSize = newsize; // 輸入?yún)?shù): 如果原文件較小,那么新的文件長(zhǎng)度與原文件一樣長(zhǎng),否則被RAM所限,如果文件長(zhǎng)度大于64KB,那么NewSize必須為UINT32 state= CH375FileModify(); //修改當(dāng)前文件的信息,修改日期和長(zhǎng)度 erusb(state); mCmdParam.Close.mUpdateLen = 0; // 不要自動(dòng)計(jì)算文件長(zhǎng)度,如果自動(dòng)計(jì)算,那么該長(zhǎng)度總是512的倍數(shù) state=CH375FileClose( );//長(zhǎng)度更新 erusb(state); //打開文件讀數(shù)據(jù) strcpy(mCmdParam.Open.mPathName,"\\DATA.TXT") ; state=CH375FileOpen( ); if ( state == ERR_MISS_DIR || state== ERR_MISS_FILE ) USB_ERROR=1; else if ( CH375vFileSize > FILE_DATA_BUF_LEN ) { /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以只讀取不超過63個(gè)扇區(qū),也就是不超過32256字節(jié) */ seccount = FILE_DATA_BUF_LEN / 512; /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以只讀取不超過63個(gè)扇區(qū),也就是不超過32256字節(jié) */ newsize= FILE_DATA_BUF_LEN; /* 由于RAM有限所以限制長(zhǎng)度 */ } else { /* 如果原文件較小,那么使用原長(zhǎng)度 */ seccount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 計(jì)算文件的扇區(qū)數(shù),因?yàn)樽x寫是以扇區(qū)為單位的,先加511是為了讀出文件尾部不足1個(gè)扇區(qū)的部分 */ newsize = (UINT16)CH375vFileSize; /* 原文件的長(zhǎng)度 */ } mCmdParam.Read.mSectorCount = seccount; /* 讀取全部數(shù)據(jù),如果超過60個(gè)扇區(qū)則只讀取60個(gè)扇區(qū) */

CH375vFileSize += 511; /* 默認(rèn)情況下,以扇區(qū)方式讀取數(shù)據(jù)時(shí),無法讀出文件尾部不足1個(gè)扇區(qū)的部分,所以必須臨時(shí)加大文件長(zhǎng)度以讀取尾部零頭 */ state = CH375FileRead( ); /* 從文件讀取數(shù)據(jù) */ CH375vFileSize -= 511; /* 恢復(fù)原文件長(zhǎng)度 */ erusb( state );}}


謝謝啊,這回能打開了,多謝多謝,還有個(gè)問題,在程序什么地方需要加延時(shí),有時(shí)單步執(zhí)行沒問題,可一全速執(zhí)行,程序就跑飛了,結(jié)果不正確了。


你程序跑飛的話,那么,你的程序是停在什么地方,估計(jì)是停在等待的地方,你全速運(yùn)行之后,所謂的結(jié)果不正確是什么意思,是寫下去的數(shù)據(jù)不對(duì)嗎?還是別的問題,這個(gè)應(yīng)該不是程序上面的問題了,估計(jì)是仿真器的問題


全速執(zhí)行數(shù)就寫不進(jìn)去了,好像需要在哪 加點(diǎn)延時(shí)啥的


幫頂,同問……


如果數(shù)據(jù)寫進(jìn)去不正確的話,一般有下面幾種可能: 1,對(duì)于51單片機(jī)來說,采用的復(fù)制方式是P2+R0,而采用的單片機(jī)是自帶1K外部RAM的單片機(jī)(或者更多),如果這個(gè)時(shí)候不將自帶的外部RAM給關(guān)閉掉的話,那么以扇區(qū)方式寫數(shù)據(jù)的話,寫進(jìn)去的數(shù)據(jù)是錯(cuò)誤的。 2,以扇區(qū)方式來寫的話,文件緩沖區(qū)出了問題,寫進(jìn)去的數(shù)據(jù)有問題,這個(gè)主要和硬件有關(guān)系,例如573壞掉之類的,都會(huì)出現(xiàn)問題。 3,程序上面的問題,例如沒有按照我們提供的流程來寫數(shù)據(jù)等等。 4,三個(gè)讀寫子函數(shù)的時(shí)序問題(對(duì)于375芯片還有三個(gè)讀寫子函數(shù)的延時(shí)問題),對(duì)于三個(gè)讀寫子函數(shù)時(shí)序的話,你可以看寫我們的置頂帖,時(shí)序問題比較難查,因?yàn)樵谀阕鰷y(cè)試命令的時(shí)候可能時(shí)序有點(diǎn)問題是可以通過的,但是在進(jìn)行數(shù)據(jù)讀寫話,那么就會(huì)出現(xiàn)問題,有客戶碰到這種情況,最后檢查出來就是時(shí)序問題。 5,單片機(jī)速度問題,特別對(duì)于晶振較低的51單片機(jī)以及用仿真器來進(jìn)行U盤讀寫的調(diào)試,在太慢的情況下,可能就會(huì)死在庫里面,或者個(gè)別的函數(shù)出現(xiàn)問題。


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

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