电脑上打不开U盘中的文件(ch375写入的.TXT)

我用ch375a往u盘中写入.TXT文件,采用ch375hf4.lib,采用扇区读写模式,但在电脑上可见该文件,文件大小时间都对,但打不开,也复制不了,用ch375的CH375FileRead也打不开,不知为什么,望指教。

大家帮帮我吧 ,俺是新手,闹心中


创建的文件名要符合DOS规范,8+3格式,并且都要大写,还有库4支持FAT12/FAT16,在写文件之前要将U盘格成FAT12/FAT16


这个应该是的程序上面的问题,能创建文件的话,那就说明你的磁盘缓冲区以及变量的设置都是成功的,不能往里面写数据的话,那么,你看下你的文件缓冲区的定义正确不正确,以及你的数据有没有往文件缓冲区里面复制等等


文件名应该没问题,我特别注意了U盘是在windows下用FAT格式化的 不是FAT32


这是我的完整程序,就是想把文本写入u盘中,电脑能读出来,能复制,现在写的数是试试编的好不好使

#include #include #include

//关于中断的宏定义 #define LIB_CFG_INT_EN 0 //CH375为查询方式 #define CH375_INT_NO 1 //CH375中断号为INT1 #define CH375_INT_FLAG IE1 // IE1,CH375中断标志 #define CH375_INT_EN EX1 //EX1,CH375中断允许位 #define CH375_INT_WIRE INT1

//文件的读写方式设定 #define LIB_CFG_DISK_IO 3 //磁盘读写的数据的复制方式,3为"单DPTR和P2+R0复制" #define LIB_CFG_FILE_IO 3 // 文件读写的数据的复制方式,3为"单DPTR和P2+R0复制"

//命令口和数据口 #define CH375_CMD_PORT_ADDR 0xB001 //CH375命令端口的地址为B001 #define CH375_DAT_PORT_ADDR 0xB000 //CH375数据端口的地址为B000

//缓冲区定位,62256为32K,定4000H-41FFH为DISK-BASE-BUF(512字节) // 定4200H-7FFFH为FILE-DATA-BUF(共15872字节,31个扇区)

#define DISK_BASE_BUF_ADDR 0x4000 //外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE #define FILE_DATA_BUF_ADDR 0x4200 //外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度 #define FILE_DATA_BUF_LEN 0x3E00 //外部RAM的文件数据缓冲区,缓冲区长度为31个扇区,15872个字节

//为节省代码,禁止程序中不用的函数 #define NO_DEFAULT_CH375_F_ENUM 1 //未调用枚举函数CH375FileEnumer程序 #define NO_DEFAULT_CH375_F_QUERY 1 // 未调用询问函数CH375FileQuery程序

#include"CH375HF4.H"

//声明外部变量ERROR; extern UINT8 ERROR;//错误字节 extern bit USB_ERROR;//ERROR的第6位表示USB错;

sbit reset=P1^6;

UINT16 FILESIZE=256;//文件中的字节数,文件较大时(大于15872个字节),一次写入的扇区数为31,写入长度为FILE_DATA_BUF_LEN, //共需调用FILESIZE/FILE_DATA_BUF_LEN次,每次文件长度为15872个字节,最后不满31个扇区的数据,共有FILESIZE%FILE_DATA_BUF_LEN字节, //最后写入的扇区数为((FILESIZE%FILE_DATA_BUF_LEN)+511)/512扇区,文件长度为(UINT16 )FILESIZE%FILE_DATA_BUF_LEN //文件长度较小时(小于15872个字节),只需调用一次,写入的扇区数为(FILESIZE+511)/512扇区文件长度为(UINT16 ) //FILESIZE%FILE_DATA_BUF_LEN UINT16 YEAR,MONTH,DAY;

//出错处理,置位出错标志 void erusb(UINT8 i) {if(i!=0) USB_ERROR=1; else return; } //延时100毫秒 void delay100ms(){ UINT8 i,j,k; for(i=0;i<200;i++) for(j=0;j<200;j++) k+=3;}

//向新文件中写入数据(多次调用) void write(UINT8 seccount) { mCmdParam.WriteX.mSectorCount = seccount; //写入扇区数 mCmdParam.WriteX.mDataBuffer=&FILE_DATA_BUF[0];//缓冲区启始地址 CH375FileWriteX( ); //以扇区为单位向文件写入数据 }

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;//写入的扇区数 UINT16 addsize;//增加的文件长度 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(); //查询磁盘是否准备好 for(ready_wait=6;ready_wait!=0;ready_wait--) {delay100ms(); state=CH375DiskReady(); if(state==ERR_SUCCESS) break;} //状态位USB_DISK_DISCONNECT置1,U盘没连上

//打开文件 strcpy( mCmdParam.Open.mPathName, "\\DATA.TXT" ); //文件名,该文件在根目录下 state=CH375FileOpen( ); //打开文件 //找到文件.文件MDADTA.TXT尾部定位 if(state==0) // 找到文件 { mCmdParam.Locate.mSectorOffset = 0xffffffff; //移动文件指针到文件末尾 CH375FileLocate(); }//移动文件指针,以便在原文件的末尾追加数据

//没找到文件,创建新文件并写入数据 else if(state==ERR_MISS_FILE)//没找到文件,创建新文件并写入数据 { strcpy( mCmdParam.Create.mPathName, "\\DATA.TXT" ); //创建新文件,在根目录下 state=CH375FileCreate( ); //新建文件并打开,如果文件已经存在则先删除后再新建 erusb(state);} //定扇区数,写入数据 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) ; //最后写入的扇区数为seccount,写入的长度为newsize; //修改文件长度,文件时间等 newsize=CH375vFileSize+addsize; mCmdParam.Modify.mFileAttr = 0xff; //输入参数: 新的文件属性,为0FFH则不修改 mCmdParam.Modify.mFileTime = 0xffff; //输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(YEAR,MONTH, DAY); //输入参数: 新的文件日期 mCmdParam.Modify.mFileSize = newsize; // 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 state= CH375FileModify(); //修改当前文件的信息,修改日期和长度 erusb(state); mCmdParam.Close.mUpdateLen = 0; // 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 state=CH375FileClose( );//长度更新 erusb(state); //打开文件读数据 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字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */ seccount = FILE_DATA_BUF_LEN / 512; /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */ newsize= FILE_DATA_BUF_LEN; /* 由于RAM有限所以限制长度 */ } else { /* 如果原文件较小,那么使用原长度 */ seccount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的,先加511是为了读出文件尾部不足1个扇区的部分 */ newsize = (UINT16)CH375vFileSize; /* 原文件的长度 */ } mCmdParam.Read.mSectorCount = seccount; /* 读取全部数据,如果超过60个扇区则只读取60个扇区 */

CH375vFileSize += 511; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */ state = CH375FileRead( ); /* 从文件读取数据 */ CH375vFileSize -= 511; /* 恢复原文件长度 */ erusb( state );}}


你可以把你的程序帖出来或是发到我们技术信箱,我们看一下是不是程序的读写方面有问题。


看的清吗,看不清我在重贴一下


重贴 #include #include #include

//关于中断的宏定义 #define LIB_CFG_INT_EN 0 //CH375为查询方式 #define CH375_INT_NO 1 //CH375中断号为INT1 #define CH375_INT_FLAG IE1 // IE1,CH375中断标志 #define CH375_INT_EN EX1 //EX1,CH375中断允许位 #define CH375_INT_WIRE INT1

//文件的读写方式设定 #define LIB_CFG_DISK_IO 3 //磁盘读写的数据的复制方式,3为"单DPTR和P2+R0复制" #define LIB_CFG_FILE_IO 3 // 文件读写的数据的复制方式,3为"单DPTR和P2+R0复制"

//命令口和数据口 #define CH375_CMD_PORT_ADDR 0xB001 //CH375命令端口的地址为B001 #define CH375_DAT_PORT_ADDR 0xB000 //CH375数据端口的地址为B000

//缓冲区定位,62256为32K,定0000H-3FFFH为全局变量,定4000H-41FFH为DISK-BASE-BUF(512字节) // 定4200H-7FFFH为FILE-DATA-BUF(共15872字节,31个扇区)

#define DISK_BASE_BUF_ADDR 0x4000 //外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE #define FILE_DATA_BUF_ADDR 0x4200 //外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度 #define FILE_DATA_BUF_LEN 0x3E00 //外部RAM的文件数据缓冲区,缓冲区长度为31个扇区,15872个字节

//为节省代码,禁止程序中不用的函数 #define NO_DEFAULT_CH375_F_ENUM 1 //未调用枚举函数CH375FileEnumer程序 #define NO_DEFAULT_CH375_F_QUERY 1 // 未调用询问函数CH375FileQuery程序

#include"CH375HF4.H"

//声明外部变量ERROR; extern UINT8 ERROR;//错误字节 extern bit USB_ERROR;//ERROR的第6位表示USB错;

sbit reset=P1^6;

UINT16 FILESIZE=256;//文件中的字节数,文件较大时(大于15872个字节),一次写入的扇区数为31,写入长度为FILE_DATA_BUF_LEN, //共需调用FILESIZE/FILE_DATA_BUF_LEN次,每次文件长度为15872个字节,最后不满31个扇区的数据,共有FILESIZE%FILE_DATA_BUF_LEN字节, //最后写入的扇区数为((FILESIZE%FILE_DATA_BUF_LEN)+511)/512扇区,文件长度为(UINT16 )FILESIZE%FILE_DATA_BUF_LEN //文件长度较小时(小于15872个字节),只需调用一次,写入的扇区数为(FILESIZE+511)/512扇区文件长度为(UINT16 ) //FILESIZE%FILE_DATA_BUF_LEN UINT16 YEAR,MONTH,DAY;

//出错处理,置位出错标志 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;}

//向新文件中写入数据(多次调用) void write(UINT8 seccount) { mCmdParam.WriteX.mSectorCount = seccount; //写入扇区数 mCmdParam.WriteX.mDataBuffer=&FILE_DATA_BUF[0];//缓冲区启始地址 CH375FileWriteX( ); //以扇区为单位向文件写入数据 }

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;//写入的扇区数 UINT16 addsize;//增加的文件长度 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(); //查询磁盘是否准备好 for(ready_wait=6;ready_wait!=0;ready_wait--) {delay100ms(); state=CH375DiskReady(); if(state==ERR_SUCCESS) break;} //状态位USB_DISK_DISCONNECT置1,U盘没连上

//打开文件 strcpy( mCmdParam.Open.mPathName, "\\DATA.TXT" ); //文件名,该文件在根目录下 state=CH375FileOpen( ); //打开文件 //找到文件.文件MDADTA.TXT尾部定位 if(state==0) // 找到文件 { mCmdParam.Locate.mSectorOffset = 0xffffffff; //移动文件指针到文件末尾 CH375FileLocate(); }//移动文件指针,以便在原文件的末尾追加数据

//没找到文件,创建新文件并写入数据 else if(state==ERR_MISS_FILE)//没找到文件,创建新文件并写入数据 { strcpy( mCmdParam.Create.mPathName, "\\DATA.TXT" ); //创建新文件,在根目录下 state=CH375FileCreate( ); //新建文件并打开,如果文件已经存在则先删除后再新建 erusb(state);} //定扇区数,写入数据 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) ; //最后写入的扇区数为seccount,写入的长度为newsize; //修改文件长度,文件时间等 newsize=CH375vFileSize+addsize; mCmdParam.Modify.mFileAttr = 0xff; //输入参数: 新的文件属性,为0FFH则不修改 mCmdParam.Modify.mFileTime = 0xffff; //输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(YEAR, MONTH, DAY); //输入参数: 新的文件日期 mCmdParam.Modify.mFileSize = newsize; // 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 state= CH375FileModify(); //修改当前文件的信息,修改日期和长度 erusb(state); mCmdParam.Close.mUpdateLen = 0; // 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 state=CH375FileClose( );//长度更新 erusb(state); //打开文件读数据 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字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */ seccount = FILE_DATA_BUF_LEN / 512; /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */ newsize= FILE_DATA_BUF_LEN; /* 由于RAM有限所以限制长度 */ } else { /* 如果原文件较小,那么使用原长度 */ seccount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的,先加511是为了读出文件尾部不足1个扇区的部分 */ newsize = (UINT16)CH375vFileSize; /* 原文件的长度 */ } mCmdParam.Read.mSectorCount = seccount; /* 读取全部数据,如果超过60个扇区则只读取60个扇区 */

CH375vFileSize += 511; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */ state = CH375FileRead( ); /* 从文件读取数据 */ CH375vFileSize -= 511; /* 恢复原文件长度 */ erusb( state );}}


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

//关于中断的宏定义 #define LIB_CFG_INT_EN 0 //CH375为查询方式 #define CH375_INT_NO 1 //CH375中断号为INT1 #define CH375_INT_FLAG IE1 // IE1,CH375中断标志 #define CH375_INT_EN EX1 //EX1,CH375中断允许位 #define CH375_INT_WIRE INT1

//文件的读写方式设定 #define LIB_CFG_DISK_IO 3 //磁盘读写的数据的复制方式,3为"单DPTR和P2+R0复制" #define LIB_CFG_FILE_IO 3 // 文件读写的数据的复制方式,3为"单DPTR和P2+R0复制"

//命令口和数据口 #define CH375_CMD_PORT_ADDR 0xB001 //CH375命令端口的地址为B001 #define CH375_DAT_PORT_ADDR 0xB000 //CH375数据端口的地址为B000

//缓冲区定位,62256为32K,定0000H-3FFFH为全局变量,定4000H-41FFH为DISK-BASE-BUF(512字节) // 定4200H-7FFFH为FILE-DATA-BUF(共15872字节,31个扇区)

#define DISK_BASE_BUF_ADDR 0x4000 //外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE #define FILE_DATA_BUF_ADDR 0x4200 //外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度 #define FILE_DATA_BUF_LEN 0x3E00 //外部RAM的文件数据缓冲区,缓冲区长度为31个扇区,15872个字节

//为节省代码,禁止程序中不用的函数 #define NO_DEFAULT_CH375_F_ENUM 1 //未调用枚举函数CH375FileEnumer程序 #define NO_DEFAULT_CH375_F_QUERY 1 // 未调用询问函数CH375FileQuery程序

#include"CH375HF4.H"

//声明外部变量ERROR; extern UINT8 ERROR;//错误字节 extern bit USB_ERROR;//ERROR的第6位表示USB错;

sbit reset=P1^6;

UINT16 FILESIZE=256;//文件中的字节数,文件较大时(大于15872个字节),一次写入的扇区数为31,写入长度为FILE_DATA_BUF_LEN, //共需调用FILESIZE/FILE_DATA_BUF_LEN次,每次文件长度为15872个字节,最后不满31个扇区的数据,共有FILESIZE%FILE_DATA_BUF_LEN字节, //最后写入的扇区数为((FILESIZE%FILE_DATA_BUF_LEN)+511)/512扇区,文件长度为(UINT16 )FILESIZE%FILE_DATA_BUF_LEN //文件长度较小时(小于15872个字节),只需调用一次,写入的扇区数为(FILESIZE+511)/512扇区文件长度为(UINT16 ) //FILESIZE%FILE_DATA_BUF_LEN UINT16 YEAR,MONTH,DAY;

//出错处理,置位出错标志 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;}

//向新文件中写入数据(多次调用) void write(UINT8 seccount) { mCmdParam.WriteX.mSectorCount = seccount; //写入扇区数 mCmdParam.WriteX.mDataBuffer=&FILE_DATA_BUF[0];//缓冲区启始地址 CH375FileWriteX( ); //以扇区为单位向文件写入数据 }

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;//写入的扇区数 UINT16 addsize;//增加的文件长度 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(); //查询磁盘是否准备好 for(ready_wait=6;ready_wait!=0;ready_wait--) {delay100ms(); state=CH375DiskReady(); if(state==ERR_SUCCESS) break;} //状态位USB_DISK_DISCONNECT置1,U盘没连上

//打开文件 strcpy( mCmdParam.Open.mPathName, "\\DATA.TXT" ); //文件名,该文件在根目录下 state=CH375FileOpen( ); //打开文件 //找到文件.文件MDADTA.TXT尾部定位 if(state==0) // 找到文件 { newsize=CH375vFileSize; /* 找到文件将文件长度保存 */ mCmdParam.Locate.mSectorOffset = 0xffffffff; //移动文件指针到文件末尾 CH375FileLocate(); }//移动文件指针,以便在原文件的末尾追加数据

//没找到文件,创建新文件并写入数据 else if(state==ERR_MISS_FILE)//没找到文件,创建新文件并写入数据 { strcpy( mCmdParam.Create.mPathName, "\\DATA.TXT" ); //创建新文件,在根目录下 state=CH375FileCreate( ); //新建文件并打开,如果文件已经存在则先删除后再新建 erusb(state);} //定扇区数,写入数据 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) //最后写入的扇区数为seccount,写入的长度为newsize; //修改文件长度,文件时间等 newsize=CH375vFileSize+addsize; mCmdParam.Modify.mFileAttr = 0xff; //输入参数: 新的文件属性,为0FFH则不修改 mCmdParam.Modify.mFileTime = 0xffff; //输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(YEAR, MONTH, DAY); //输入参数: 新的文件日期 mCmdParam.Modify.mFileSize = newsize; // 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 state= CH375FileModify(); //修改当前文件的信息,修改日期和长度 erusb(state); mCmdParam.Close.mUpdateLen = 0; // 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 state=CH375FileClose( );//长度更新 erusb(state); //打开文件读数据 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字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */ seccount = FILE_DATA_BUF_LEN / 512; /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */ newsize= FILE_DATA_BUF_LEN; /* 由于RAM有限所以限制长度 */ } else { /* 如果原文件较小,那么使用原长度 */ seccount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的,先加511是为了读出文件尾部不足1个扇区的部分 */ newsize = (UINT16)CH375vFileSize; /* 原文件的长度 */ } mCmdParam.Read.mSectorCount = seccount; /* 读取全部数据,如果超过60个扇区则只读取60个扇区 */

CH375vFileSize += 511; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */ state = CH375FileRead( ); /* 从文件读取数据 */ CH375vFileSize -= 511; /* 恢复原文件长度 */ erusb( state );}}


谢谢啊,这回能打开了,多谢多谢,还有个问题,在程序什么地方需要加延时,有时单步执行没问题,可一全速执行,程序就跑飞了,结果不正确了。


你程序跑飞的话,那么,你的程序是停在什么地方,估计是停在等待的地方,你全速运行之后,所谓的结果不正确是什么意思,是写下去的数据不对吗?还是别的问题,这个应该不是程序上面的问题了,估计是仿真器的问题


全速执行数就写不进去了,好像需要在哪 加点延时啥的


帮顶,同问……


如果数据写进去不正确的话,一般有下面几种可能: 1,对于51单片机来说,采用的复制方式是P2+R0,而采用的单片机是自带1K外部RAM的单片机(或者更多),如果这个时候不将自带的外部RAM给关闭掉的话,那么以扇区方式写数据的话,写进去的数据是错误的。 2,以扇区方式来写的话,文件缓冲区出了问题,写进去的数据有问题,这个主要和硬件有关系,例如573坏掉之类的,都会出现问题。 3,程序上面的问题,例如没有按照我们提供的流程来写数据等等。 4,三个读写子函数的时序问题(对于375芯片还有三个读写子函数的延时问题),对于三个读写子函数时序的话,你可以看写我们的置顶帖,时序问题比较难查,因为在你做测试命令的时候可能时序有点问题是可以通过的,但是在进行数据读写话,那么就会出现问题,有客户碰到这种情况,最后检查出来就是时序问题。 5,单片机速度问题,特别对于晶振较低的51单片机以及用仿真器来进行U盘读写的调试,在太慢的情况下,可能就会死在库里面,或者个别的函数出现问题。


只有登录才能回复,可以选择微信账号登录