在经过了一次又一次的完善后,在红桃六,hcn,SCM等高手的热心帮助下U盘读写终于成功了!!!非常感谢他们的帮助.
for ( i=0; i // c = *pCodeStr; c = IDATA[i];//注我用定义的XDATA的IDATA数组代替ROM上的"Note: \xd\xaHELLOWorld\xd\xa"; //这一串字符,结果IDATA数组的数值不能写到新建文件中去? mCmdParam.ByteWrite.mByteBuffer[i] = c; if ( c == 0 ) break; /* 源字符串结束 */ // pCodeStr++; } if ( i == 0 ) break; /* 源字符串结束,完成写文件 */
请问是什么原因?是格式不对吗/? 2,Note: \xd\xaHELLOWorld\xd\xa";中的\xd\xa是什么作用?
(1)IDATA是什么?若是数组,那么它是一个地址,再若c是一个字符型变量,那么c = IDATA语句是错误的 另,IDATA是一个数组的话,赋值过程应是这样: for ( i=0; i if( i == sizeof( IDATA ) ) break; c = IDATA[ i ];//注我用定义的XDATA的IDATA数组代替ROM上的"Note: \xd\xaHELLOWorld\xd\xa"; //这一串字符,结果IDATA数组的数值不能写到新建文件中去? mCmdParam.ByteWrite.mByteBuffer[ i ] = c; } (2)\xd\xa表示回车符,起换行作用
IDATA就是数组,c = IDATA;//程序中我是这样的c= IDATA[i];还是写不进,插上U盘后,当菝出U盘后出现82
(1)把完整的程序贴出来吧 (2)用串口监控程序,LibInit,DiskConnect,DiskReady是否全都通过
c=IDATA什么意思? 你就是想把IDATA里面的数据复制到mCmdParam.ByteWrite.mByteBuffer中去的吧? 那你的程序不对,按照SCM的做法.
帖子上不能显示c=IDATA[ i] 加个空格才能显示c=IDATA[ i] 我用的就是想把数组IDATA中的数逐个复制
/* 2004.06.05 **************************************** ** Copyright (C) W.ch 1999-2004 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Interface for CH375 ** ** TC2.0@PC, KC7.0@MCS51 ** **************************************** */ /* CH375 主机文件系统接口 */ /* 支持: FAT12/FAT16/FAT32 */
/* MCS-51单片机C语言的U盘文件读写示例程序, 适用于89C52或者更大程序空间的单片机,也适用于ATMEL/PHILIPS/SST等具有1KB内部RAM的单片机 */ /* 该程序将U盘中的/C51/CH375HFT.C文件中的前600个字符显示出来, 如果找不到原文件CH375HFT.C, 那么该程序将显示C51子目录下所有以CH375开头的文件名, 如果找不到C51子目录, 那么该程序将显示根目录下的所有文件名, 最后将程序ROM中的一个字符串写入写入新建的文件"MyTest.TXT"中 */ /* CH375的INT#引脚采用查询方式处理, 数据复制方式为"单DPTR复制",兼容性最好但是速度最慢, 本例只使用512字节的外部RAM, 同时作为磁盘数据缓冲区和文件数据缓冲区, 演示没有外部RAM但是单片机的内置RAM大于768字节的应用 */
/* 本例以字节为单位读写U盘文件,读写速度较扇区模式慢,但是由于字节模式读写文件不需要文件数据缓冲区FILE_DATA_BUF, 所以总共只需要600字节的RAM,适用于单片机硬件资源有限、数据量小并且读写速度要求不高的系统 */
/* C51 CH375HFT.C */ /* LX51 CH375HFT.OBJ , CH375HF6.LIB 如果将CH375HF6换成CH375HF4就禁止支持FAT32 */ /* OHX51 CH375HFT */
#include #include
/* 以下定义的详细说明请看CH375HF6.H文件 */ #define LIB_CFG_DISK_IO 1 /* 磁盘读写的数据的复制方式,1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" */ #define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */ /*#define LIB_CFG_FILE_IO_DEFAULT 1*/ /* 使用CH375HF6.H提供的默认"外部子程序" */
#define CH375_CMD_PORT_ADDR 0xFFF0 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBFF0 /* CH375数据端口的I/O地址 */ /* 只使用单片机内置的1KB外部RAM: 0000H-01FFH 为磁盘读写缓冲区, 以字节为单位读写文件不需要文件数据读写缓冲区FILE_DATA_BUF */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */ /* 由于单片机内置的外部RAM只有1KB, 有些单片机还要去掉256字节内部RAM, 只剩下768字节的外部RAM, 其中前512字节由CH375子程序用于磁盘数据缓冲 */ // #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */ /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */
#define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
#define NO_DEFAULT_CH375_F_ENUM 1 /* 未调用CH375FileEnumer程序故禁止以节约代码 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未调用CH375FileQuery程序故禁止以节约代码 */
#include "CH375HF4.H" /* 如果不需要支持FAT32,那么请选用CH375HF4.H */ /* 延时100毫秒,不精确 */ unsigned char xdata IDATA[]={"0000000001111111111111555555555"}; void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; }
/* 将程序空间的字符串复制到内部RAM中,返回字符串长度 */ UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }
/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ while ( 1 ) { mDelay100mS( ); mDelay100mS( ); } }
/* 为printf和getkey输入输出初始化串口 */ void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xfA; /* 11.0592MHz晶振, 9600bps */ TR1 = 1; TI = 1; }
main( ) { UINT8 i, c; // UINT16 TotalCount; UINT8 code *pCodeStr; mDelay100mS( ); /* 延时100毫秒 */ mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ printf( "Start\n" ); i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它电路初始化 */ while ( 1 ) { printf( "Wait Udisk\n" ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */ // while ( CH375DiskStatus < DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘插入 */ // if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */ // mDelay100mS( ); // } mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( );
/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelay100mS( );
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } /* 查询磁盘物理容量 */ printf( "DiskSize\n" ); i = CH375DiskSize( ); mStopIfError( i ); printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) ); //显示为以MB为单位的容量 #ifdef EN_DISK_WRITE /* 子程序库支持写操作 */ /* 产生新文件 */ printf( "Create\n" ); mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/温度测控.TXT" ); /* 新文件名,在根目录下,中文文件名 */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); printf( "Write\n" ); //pCodeStr = "Note: \xd\xaHELLO World\xd\xa"; while( 1 ) { /* 分多次写入文件数据 */ for ( i=0; i // c = *pCodeStr; if(i==sizeof(IDATA)) break; c = IDATA[ i]; mCmdParam.ByteWrite.mByteBuffer[ i] = c; // if ( c == 0 ) break; /* 源字符串结束 */ // pCodeStr++; } if ( i == 0 ) break; /* 源字符串结束,完成写文件 */ mCmdParam.ByteWrite.mByteCount = i; /* 写入数据的字符数,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后写 */ i = CH375ByteWrite( ); /* 向文件写入数据 */ mStopIfError( i ); } printf( "Close\n" ); mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ i = CH375FileClose( ); mStopIfError( i ); #endif while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘拔出 */ mDelay100mS( ); mDelay100mS( ); } }
(1)确认创建文件成功没 (2)while( 1 ){/* 分多次写入文件数据 */}语句有问题,改为下面程序试试 unsigned char count, j; unsigned char *pIDATA;
count = sizeof( IDATA ); pIDATA = IDATA; while( count ) { j = 0; for( i = 0; i < MAX_BYTE_IO; i ++ ) { c = *pIDATA; mCmdParam.ByteWrite.mByteBuffer[i] = c; pIDATA++; count --; j ++; if( count == 0 ) break; /* 源字符串结束 */ } mCmdParam.ByteWrite.mByteCount = j; /* 写入数据的字符数,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后写 */ i = CH375ByteWrite( ); /* 向文件写入数据 */ mStopIfError( i ); }
1.文件创建成功了的 2.你的这个程序能 把xdata上的数据写到U盘中去了,为什么程序有错误呢?读程序好像也没有错误。 3。最后我把UINT8 code *pCodeStr; 定义在了xdata 如UINT8 xdata *pCodeStr;这样U盘调试的时候没有显示错误,但任然读出的是一个乱码 4.后来我有重新定义了一个在xdata的数组,并且定义了数组的大小把if ( c == 0 ) break;这条语句换成了if ( i== 数组大小的值 ) break; 这是能读取第一个字符 虽然U盘能读写了,但还是很多不解。每个问题都得发帖问,自己根本不能解决问题。