U盘模块问题
三线接口,8051控制U盘模块的电源程序中采用定时写文件的方式,如果开始时开关电源就可以在U盘中写入文件也可以在文件中追加数据,但是采用定时方式程序中关闭电源,到定时开启电源,延时6秒甚至10秒,也不能写入文件或追加数据,请问是何原因。有关程序

/*打开或制造MYTEMP.TXT文件*/
void opendisk(void) /*打开文件*/
{
uchar i;
uchar *name;
/* 检查U盘是否准备好,大多数U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
for ( i = 0; i < 8; i ++ )
{
msec(800 );
if ( ExecCommand( CMD_DiskReady, 0 ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
}
/* 从ADC取得数据保存到文件中,首先打开已有文件,如果文件不存在,则新建一个 */
name = "/MYTEMP.TXT"; /* 文件名,斜杠说明是从根目录开始 */
strcpy( mCmdParam.Open.mPathName, name ); /* 原文件名 */
i = ExecCommand( CMD_FileOpen, MAX_PATH_LEN ); /* 打开文件,输入参数置为最大值,省得再计算参数长度 */
if ( i == ERR_MISS_FILE ) /* ERR_MISS_FILE说明没有找到文件,所以新建一个 */
{
strcpy( mCmdParam.Create.mPathName, name ); /* 新文件名,在根目录下 */
i = ExecCommand( CMD_FileCreate, MAX_PATH_LEN ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
}
else
{ /* 找到文件,说明文件已存在,因为不打算覆盖原数据,所以移动文件指针到末尾,以便追加数据 */
mCmdParam.ByteLocate.mByteOffset = 0xFFFFFFFF; /* 移动到文件尾,用于在CMD_FileOpen打开文件后,继续追加数据到已打开文件的末尾 */
i = ExecCommand( CMD_ByteLocate, 4 ); /* 以字节为单位移动文件指针 */
}
}
/*向文件MYTEMP.TXT文件写入日期时间*/
void savedate(void ) /*U盘文件写入日期时间*/
{
U16 xdata year,month,date,hour,mint;
uchar len;
msec( 50 ); /* 延时50毫秒*/
year =bcd_bin(nowtime[5]);
year +=2000;
month =bcd_bin(nowtime[4]);
date =bcd_bin(nowtime[3]);
hour =bcd_bin(nowtime[2]);
mint =bcd_bin(nowtime[1]);
/*写入年。月。日。小时。分,时间信息*/
len =sprintf(mCmdParam.ByteWrite.mByteBuffer, "%04d.%02d.%02d.", year,month,date); /* 将二制制数据格式为一行字符串 */
mCmdParam.ByteWrite.mByteCount = len; /* 指定本次写入的字节数,不能超过MAX_BYTE_IO,否则另用缓冲区分多次写入 */
ExecCommand( CMD_ByteWrite, len+1 ); /* 以字节为单位向文件写入日期数据 */
len =sprintf(mCmdParam.ByteWrite.mByteBuffer, "%02d.%02d,", hour,mint ); /* 将二制制数据格式为一行字符串 */
mCmdParam.ByteWrite.mByteCount = len; /* 指定本次写入的字节数,不能超过MAX_BYTE_IO,否则另用缓冲区分多次写入 */
ExecCommand( CMD_ByteWrite, len+1 ); /* 以字节为单位向文件写入日期数据 */
}
/*写入温度湿度数据并关闭文件*/
void saveclose(void) /*写入数据关闭文件*/
{
uchar len;
/*写入温度湿度数据*/
strcpy( mCmdParam.ByteWrite.mByteBuffer, "今天的ADC数据到此结束\xd\xa" );
len = strlen( mCmdParam.ByteWrite.mByteBuffer ); /* 计算字符串长度 */
mCmdParam.ByteWrite.mByteCount = len; /* 将原文件中的20个字节的数据添加到新文件的末尾 */
ExecCommand( CMD_ByteWrite, len+1 ); /* 以字节为单位向文件写入数据 */
mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,当以字节为单位向文件写入数据后,如果没有用0长度的CMD_ByteWrite更新文件长度,那么可以在关闭文件时让模块自动更新文件长度 */
ExecCommand( CMD_FileClose, 1 ); /* 关闭文件,当以字节为单位向文件写入(追加)数据后,必须在用完文件后关闭文件 */
msec(50); /*延时等待电源稳定*/
}

if(return_time_flag()) /*30min判定*/
{
msec(2000); /*延时等待电源稳定*/
init_uart(); /*使用T1作波特率发生器*/
msec(4000); /*延时等待电源稳定*/
msec(4000); /*延时等待电源稳定*/
msec(4000); /*延时等待电源稳定*/
opendisk(); /*打开文件*/
savedate(); /*U盘文件写入日期时间*/
saveclose(); /*写入数据关闭文件*/
}
这人很懒,什么都没留下
热门产品推荐 : USB转高速串口芯片CH343
正当读U盘的时候,如果断电,只读了一半,U盘会工作不正常,就是说,读一次,就要全部读完
劳动创造文明 知识改变命运
只有登录才能回复,可以选择微信账号登录