我使用CH376创建文件成功,但是文件使用读取函数打不开,但是读取函数可以打开不是376创建的文件,以下分别是我的读取函数以及创建文件函数 INT32U OpenFileFromU(PUINT8 pDestAddr, const char *pFileName) {
char FileName[16]; INT8U err,s; INT32U int32u1,int32u2; INT32U TolFileSize,TolSector,mSector,LastSize;
FileName[0]='/'; strcpy(FileName+1,pFileName);
strcpy( (char *)FileName1.Name, (char *)FileName); err = CH376FileOpen( FileName1.Name); /* 打开文件,该文件在根目录下 */ //打开文件错误 报错 if(USB_INT_SUCCESS != err) { return OPENFILEERR; }
//文件大小 TolFileSize= CH376GetFileSize( ); //总的扇区数 //字节不是扇区的整数倍 //扇区加一 TolSector=TolFileSize/DEF_SECTOR_SIZE; if((TolFileSize%DEF_SECTOR_SIZE)!=0) { TolSector+=1; } //初始化读到缓存的地址 //mCmdParam.SectorRead.mStartSector=(UINT32)(pDestAddr);
//每次读255个扇区(最大只可以读255个扇区) 需要写入的次数 int32u1=TolSector/255; //剩余的扇区数 mSector=TolSector%255; int32u2=0; if(int32u1>0) { do { //一次读取255个扇区数据 //一次最大只可以读255个扇区 //因为mCmdParam.ReadX.mSectorCount为字节类型 //mCmdParam.SectorRead.mSectorCount=255; err=CH376SecRead(pDestAddr+int32u2*255*DEF_SECTOR_SIZE,255 ,NULL) ; //读取 if(USB_INT_SUCCESS!=err) { return OPENFILEERR; } int32u1--; int32u2++;
}while(int32u1!=0); } if(mSector > 0) { //OS_ENTER_CRITICAL(); err=CH376SecRead(pDestAddr+int32u2*255*DEF_SECTOR_SIZE,mSector,NULL) ; //OS_EXIT_CRITICAL(); if(USB_INT_SUCCESS!=err) { return OPENFILEERR; } } //读文件完成 关闭文件
err = CH376FileClose(TRUE);
//关闭文件错误 报错处理 if(USB_INT_SUCCESS!=err) { return OPENFILEERR; } return TolFileSize;
}
//写文件 成功返回TRUE,失败返回FALSE INT32U WriteFileToU(PUINT8 pDestAddr, char *pFileName,INT32U uiFileSize) { //OS_//cpu_sr //cpu_sr; char FileName[16]; INT8U err; INT32U int32u1,int32u2,int32u3; INT32U TolSector,mSector,FileSize; UINT8 s; //cpu_sr = 0; FileSize = uiFileSize; if(strlen(pFileName) <= 4)//ZHULIJUN120906 ADD 无文件名的.DPP报错 { return FALSE; } FileName[0]='/'; strcpy(FileName+1,pFileName); strcpy( (char *)FileName1.Name, (char *)FileName); //生成文件 //OS_ENTER_CRITICAL();
err = CH376FileCreate(FileName1.Name); //OS_EXIT_CRITICAL(); //报错 if(USB_INT_SUCCESS!=err) { return FALSE; } s = CH376FileOpen( FileName1.Name); /* 再次打开文件 */ if(s == USB_INT_SUCCESS) { s = CH376DirInfoRead( ); /* 读取当前文件的目录信息FAT_DIR_INFO,将相关数据调到内存中 */
if(s == USB_INT_SUCCESS) { buf[0] = ATTR_ARCHIVE; CH376WriteOfsBlock( buf, STRUCT_OFFSET( FAT_DIR_INFO, DIR_Attr ), 1 ); /* 向内部缓冲区偏移地址DIR_Attr写入1个字节 */ buf[0] = (UINT8)MAKE_FILE_TIME( InRtc.Hour, InRtc.Minute, InRtc.Second ); //低八位在前 buf[1] = (UINT8)MAKE_FILE_TIME( InRtc.Hour, InRtc.Minute, InRtc.Second )>>8; //高八位在后 CH376WriteOfsBlock( buf, STRUCT_OFFSET( FAT_DIR_INFO, DIR_CrtTime ), 2 ); /* 向内部缓冲区偏移地址DIR_CrtTime写入2个字节 */ buf[0] = (UINT8)MAKE_FILE_DATE( InRtc.Year, InRtc.Month, InRtc.Date ); //低八位在前 buf[1] = (UINT8)MAKE_FILE_DATE( InRtc.Year, InRtc.Month, InRtc.Date )>>8; //高八位在后 CH376WriteOfsBlock( buf, STRUCT_OFFSET( FAT_DIR_INFO, DIR_CrtDate ), 2 ); /* 向内部缓冲区偏移地址DIR_CrtDate写入2个字节 */ buf[0] = (UINT8)FileSize; buf[1] = (UINT8)FileSize>>8; buf[2] = (UINT8)FileSize>>16; buf[3] = (UINT8)FileSize>>24; CH376WriteOfsBlock( buf, STRUCT_OFFSET( FAT_DIR_INFO, DIR_FileSize ), 4 ); /* 向内部缓冲区偏移地址DIR_FileSize写入4个字节 */
s = CH376DirInfoSave( ); /* 保存文件的目录信息 */ if ( s == USB_INT_SUCCESS ) { /* 成功修改并保存 */ } }
}
//VAR_FILE_SIZE TolSector=uiFileSize/DEF_SECTOR_SIZE; if((uiFileSize%DEF_SECTOR_SIZE)!=0) { TolSector+=1; }
//每次写255个扇区(最大只可以写255个扇区) 需要写入的次数 int32u1=TolSector/255; //剩余的扇区数 mSector=TolSector%255; int32u2 = 0; if(int32u1>0) { do { //一次写入255个扇区的数据 //一次最大只可以写255个扇区 //因为mCmdParam.WriteX.mSectorCount为字节类型 //写入数据到文件 err = CH376SecWrite(pDestAddr+int32u2*255*DEF_SECTOR_SIZE,255,NULL); //报错 if(USB_INT_SUCCESS!=err) { return FALSE; } int32u1--; int32u2++; }while(int32u1!=0); } if(mSector>0) { //写入剩余的扇区数据
//写入数据到文件 err = CH376SecWrite(pDestAddr+int32u2*255*DEF_SECTOR_SIZE,mSector,NULL); //报错 if(USB_INT_SUCCESS!=err) { return FALSE; } } //关闭文件 err = CH376FileClose(TRUE); //报错 if(USB_INT_SUCCESS!=err) { return FALSE; } return TRUE; }