CH375A读写U盘基本调试成功

从去年八月份调试了一个星期的后,中间因公司项目需要,一直在做其他的事情,今年1月中旬又开始调试这个项目,中间断断续续的,一会忙这,一会忙那个事情,现在总算把这个成功的调试出来了,哎!原来以为很简单,自己亲自做了,才知道一个小小的疏忽可能就会产生很大影响.呵呵!现在总是调试好了!   不过现在有一个问题,想问一下贵公司的技术人员,我想在文件头或者尾增加一些与文件相关的信息,比如说我增加一个扇区,用于存该文件的文件信息,这些信息都是很重要的信息,并且每次操作后,都会进行一定的修改,那么假如我在文件尾追加数据的话,会不会影响了其他文件?   我的意思是,比如说我在U盘里面存了三个文件,当我操作第二个文件后,追加了一个扇区的数据进去,这样的话,增加的数据会不会可能把我第三个文件的数据给覆盖了!   我对文件系统了解的不是很多,所以想问以下这个弱弱的问题,呵呵^_^!

恭喜 能告诉下什么原因造成的吗? 追加的数据只会在你操作文件的末尾,不会对其它文件造成影响的


这个问题是有点弱


呵呵!是有点弱!现在明白了! 但是有一个问题,为什么我读文件都正常,但是写文件的时候,有时候写到一半的时候死了,是不是读文件和写文件要求的时序不一样?而且我通过主板创建的文件,可以通过主板读出来,并能读出文件信息,但是在电脑上,只能显示文件名,里面数据都是空的,文件信息也没有显示,并且通过电脑根本就不能删除该文件!   为什么我通过电脑拷贝的文件可以通过主板读出来,而通过主板写入文件,电脑却不能识别呢?请问以下哪位知道是原因引起的吗?


这个估计和你时序上面还有点关系,你把你的延时子程序减小点试下


我先看看是不是时序的问题,想问问:从主板写进的文件,通过电脑删除文件时,提示"无法删除文件:无法读源文件或磁盘",是不是还要设置磁盘,才能让电脑识别出来?


不需要设置U盘,有可能是这样的,实际的你的文件是写下去了,FAT表也更新了,但是目录项并没有按照FAT的信息来更新文件,导致计算机读取文件的时候出错


那怎么设置,才能使得电脑可以识别文件呢? 另外,我没有改时序,但是我重复出来了写文件的问题如下: 如果我文件流程如下: (1)创建文件->写文件->关闭文件: 则第二次再写同一个文件基本上写不进去; (2)判断文件是否存在->存在就删除文件->创建文件->写文件->关闭文件:后面再写,有时候可以写进去,有时候多写几次,就写不进去了; (3)我在控制面板上专门编写一个删除文件的控制处理,如果文件发送后,我就直接把该文件删除,则一直都可以成功的写入!   而且经过反复多次实验,我发现只要不写同样的文件名的文件,则一直都可以正常写入文件,只是电脑一直都不能正常的识别文件!   我估计还是跟创建文件,删除文件等有关系,所以请问一下HCN,你认为是什么问题引起的呢?


建议你把程序发过来看下,主要看你的程序流程上面有没有问题,以及部分程序的处理上面


INT8U bRdSDRAMToUDisk(void) { //BF_FileAttribute *pFileProp; P_FAT_DIR_INFO mFileDir; BMCmdFileStart fileHead; BSchedule TmpSchedule; INT32U uiFileIndex, uiSizeRead = 0, ulTmpData = 0; INT8U ucErr, ucSectorCount, ucFlag = 1;//, ucCharNum; INT32S iErr, i;

uiFileIndex = bfGetCurrentFileIndex(); bfOpenFile(uiFileIndex, 0, &g_pFile); bfReadFile(g_pFile, (INT8U *)&fileHead, BMCMD_FILE_START_SIZE, &uiSizeRead); bfCloseFile(g_pFile); bfOpenFile(uiFileIndex, 0, &g_pFile);

//ucErr = CreateDirectory( ); mCmdParam.Create.mPathName[0] = '/'; for(i = 0; i < 8; i++) { mCmdParam.Create.mPathName[i + 1] = fileHead.ucFileName[i]; if((fileHead.ucFileName[i] == '\0') || (fileHead.ucFileName[i] == '.')) { break; } } //ucCharNum = strlen((char *)fileHead.ucFileName); if(fileHead.ucFileName[i - 1] == '.') { mCmdParam.Create.mPathName[i ] = 'u'; mCmdParam.Create.mPathName[i + 1] = 'l'; mCmdParam.Create.mPathName[i + 2] = 'e'; mCmdParam.Create.mPathName[i + 3] = '\0'; } else { mCmdParam.Create.mPathName[i + 1] = '.'; mCmdParam.Create.mPathName[i + 2] = 'u'; mCmdParam.Create.mPathName[i + 3] = 'l'; mCmdParam.Create.mPathName[i + 4] = 'e'; mCmdParam.Create.mPathName[i + 5] = '\0'; } bCheckFileExist((INT8U*)&mCmdParam.Create.mPathName[0]); ucErr = CH375FileCreate(); if(ucErr == ERR_SUCCESS) { TmpSchedule.ulLast = 0; TmpSchedule.ulAll = fileHead.uiFileSize; TmpSchedule.ulStep = fileHead.uiFileSize / 100;

if(fileHead.uiFileSize > FILE_DATA_BUF_LEN) { ucSectorCount = (FILE_DATA_BUF_LEN >> 9); while(1) { iErr = bfReadFile(g_pFile, (INT8U *)&FILE_DATA_BUF[0], FILE_DATA_BUF_LEN, &uiSizeRead); if(iErr == BFERR_FILE_NOT_OPENED_FOR_READ) { #ifdef __LANGUAGE_CHINESE__ GUI_MsgBox((INT8U *)"文件未打开!"); #else #ifdef __LANGUAGE_SPANISH__ GUI_MsgBox((INT8U *)"No est?listo para lectura"); #else GUI_MsgBox((INT8U *)"The file is not open!"); #endif #endif delay(0x00500000); ucFlag = 0; break; } else { mCmdParam.Write.mSectorCount = ((uiSizeRead + 511) >> 9); if(mCmdParam.Write.mSectorCount) { ucErr = CH375FileWrite( ); if(ucErr == ERR_SUCCESS) { ulTmpData += uiSizeRead; TmpSchedule.ulCurrent = ulTmpData; GUI_DrawScheduleBar(32, 38, (BSchedule *)&TmpSchedule); } else { #ifdef __LANGUAGE_CHINESE__ GUI_MsgBox((INT8U *)"存储文件失败!"); #else #ifdef __LANGUAGE_SPANISH__ GUI_MsgBox((INT8U *)"?rror al guardar archivo!"); #else GUI_MsgBox((INT8U *)"Failed to store the file!"); #endif #endif delay(0x00500000); ucFlag = 0; break; } } if(mCmdParam.Write.mSectorCount < ucSectorCount) { break; } } } } else { iErr = bfReadFile(g_pFile, (INT8U *)&FILE_DATA_BUF[0], FILE_DATA_BUF_LEN, &uiSizeRead); if(iErr == BFERR_FILE_NOT_OPENED_FOR_READ) { #ifdef __LANGUAGE_CHINESE__ GUI_MsgBox((INT8U *)"文件未打开!"); #else #ifdef __LANGUAGE_SPANISH__ GUI_MsgBox((INT8U *)"No est?listo para lectura"); #else GUI_MsgBox((INT8U *)"The file is not open!"); #endif #endif delay(0x00500000); ucFlag = 0; } else { mCmdParam.Write.mSectorCount =((uiSizeRead + 511 ) >> 9); ucErr = CH375FileWrite( ); if(ucErr == ERR_SUCCESS) { ulTmpData += uiSizeRead; TmpSchedule.ulCurrent = ulTmpData; GUI_DrawScheduleBar(32, 38, (BSchedule *)&TmpSchedule); } else { #ifdef __LANGUAGE_CHINESE__ GUI_MsgBox((INT8U *)"存储文件失败!"); #else #ifdef __LANGUAGE_SPANISH__ GUI_MsgBox((INT8U *)"?rror al guardar archivo!"); #else GUI_MsgBox((INT8U *)"Failed to store the file!"); #endif #endif delay(0x00500000); ucFlag = 0; } } } ucErr = CH375FileQuery( ); if(ucErr == ERR_SUCCESS) { mFileDir = (P_FAT_DIR_INFO)( (INT8U *)(&DISK_BASE_BUF[0]) + CH375vFdtOffset ); mFileDir->DIR_CrtDate = MAKE_FILE_DATE(fileHead.Time.usYear, fileHead.Time.ucMonth, fileHead.Time.ucDay); mFileDir->DIR_CrtTime = MAKE_FILE_TIME(fileHead.Time.ucHour, fileHead.Time.ucMin, fileHead.Time.ucSec); mFileDir->DIR_LstAccDate = MAKE_FILE_DATE(fileHead.Time.usYear, fileHead.Time.ucMonth, fileHead.Time.ucDay); } mCmdParam.Modify.mFileAttr = 0x20; // 存档文件 mCmdParam.Modify.mFileTime = MAKE_FILE_TIME(fileHead.Time.ucHour, fileHead.Time.ucMin, fileHead.Time.ucSec); mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(fileHead.Time.usYear, fileHead.Time.ucMonth, fileHead.Time.ucDay); mCmdParam.Modify.mFileSize = fileHead.uiFileSize; ucErr = CH375FileModify( ); /* 修改当前文件的信息,修改日期和长度 */ if(ucErr != ERR_SUCCESS) { #ifdef __LANGUAGE_CHINESE__ GUI_MsgBox((INT8U *)"文件属性修改失败!"); #else GUI_MsgBox((INT8U *)"Failed to modify attribute!"); #endif delay(0x00500000); ucFlag = 0; } } mCmdParam.Close.mUpdateLen = 0; ucErr = CH375FileClose( ); bfCloseFile(g_pFile); gSystem.ulSysStatus[gSystem.ulSysStatusCur] = STATUS_WAITING; g_pCurMenu = g_pRootM->child; //将系统界面切换到主界面 chenaihua 2006-03-11 g_pCurWin = g_pCurMenu->pWin; GUI_UpdataWindow(); return ucFlag; }

void bCheckFileExist(INT8U* pFilePath) { INT8U i, ucErr;

for(i = 0; i < MAX_PATH_LEN ; i++) { mCmdParam.Open.mPathName[i] = mCmdParam.Create.mPathName[i]; if(mCmdParam.Create.mPathName[i] == '\0') break; } ucErr = CH375FileOpen(); if(ucErr == ERR_SUCCESS) { for(i = 0; i < MAX_PATH_LEN ; i++) { mCmdParam.Erase.mPathName[i] = mCmdParam.Create.mPathName[i]; if(mCmdParam.Create.mPathName[i] == '\0') break; } ucErr = CH375FileErase( ); if(ucErr == ERR_SUCCESS) { bListAll(); } } }


文件名应该大写,小写电脑不能打开 if(fileHead.ucFileName[i - 1] == '.') { mCmdParam.Create.mPathName[i ] = 'U'; mCmdParam.Create.mPathName[i + 1] = 'L'; mCmdParam.Create.mPathName[i + 2] = 'E'; mCmdParam.Create.mPathName[i + 3] = '\0'; } else { mCmdParam.Create.mPathName[i + 1] = '.'; mCmdParam.Create.mPathName[i + 2] = 'U'; mCmdParam.Create.mPathName[i + 3] = 'L'; mCmdParam.Create.mPathName[i + 4] = 'E'; mCmdParam.Create.mPathName[i + 5] = '\0'; }


大写用过了,不行


你首先这样做下,用自动更新文件长度来做下,也就是你的查询文件信息以及更新文件长度的程序不要,其次就是将你的子函数的延时减小,在有就是上面的问题,如果你的主文件名或者扩展名为小写的话,那是没办法打开的


我试过了,主文件名是要大写,才支持,但是中文文件名字的话,在电脑上可以删除,但是打开文件的时候里面是空的,显示的文件大小又是对的


那你用WINHEX这个软件看下你的U盘的FAT表有没有更新,如果没有更新的话,那就是你写函数那边出了问题


请问一下:WINHEX这个软件 是什么软件?我没有找到


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