字节模式读U盘错误

#define MAX_BYTE_IO 36 /* 以字节为单位单次读写文件时的最大长度,默认值是29,值大则占用内存多,值小则超过该长度必须分多次读写 */

#define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */ #define CH375_INT_NO 0 /* CH375中断号, CH375的中断线INT#引脚连接单片机的INT0引脚 */ #define CH375_INT_FLAG IE0 /* IE0,CH375中断标志 */ #define CH375_INT_EN EX0 /* EX0,CH375中断允许 */ #define pdata DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */

#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 "CH375HFC.H"

//如果单片机与CH375是串口连接,那么参考下面的子程序 void CH375_PORT_INIT( ) { SCON = 0xD0;// 设置串口为9位数据 PCON = 0x80; TMOD = 0x20; TH1 = 0xfA; /* 11.0592MHz晶振, 9600bps */ TR1 = 1; TI = 1; //设置波特率和其它串口参数 }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { TI = 0; TB8 = 1; SBUF = mCmd; while ( TI == 0 ); }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { TI = 0; TB8 = 0; SBUF = mData; while ( TI == 0 ); }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { while ( RI == 0 ); RI = 0; return( SBUF ); }

void mDelaymS( UINT8 delay ) { unsigned char i, j, c; for ( i = delay; i != 0; i -- ) { for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */ for ( j = 400; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */ } }

UINT8 mCopyCodeStringToXRAM( UINT8 xdata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }

void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ while ( 1 ) { mDelaymS( 100 ); mDelaymS( 100 ); } }

save375( ) { UINT8 i, month, hour; UINT16 date, adc, len; i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i ); CH375DiskReady( ); if ( CH375DiskStatus != DISK_DISCONNECT ) /* 查询CH375中断并更新中断状态,等待U盘插入 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelaymS( 100 ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } mCmdParam.Create.mPathName[0]='/'; mCmdParam.Create.mPathName[1]='D'; //文件名前面字符 mCmdParam.Create.mPathName[2]='A'; //文件名前面字符 mCmdParam.Create.mPathName[3]='T'; //文件名前面字符 mCmdParam.Create.mPathName[4]='A'; //文件名前面字符 mCmdParam.Create.mPathName[5]='.'; mCmdParam.Create.mPathName[6]='T'; mCmdParam.Create.mPathName[7]='X'; mCmdParam.Create.mPathName[8]='T'; mCmdParam.Create.mPathName[9]='\0'; i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */ i = CH375ByteLocate( ); mStopIfError( i ); } else if ( i == ERR_MISS_FILE ) { /* 没有找到文件,必须新建文件 */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); } else mStopIfError( i ); /* 打开文件时出错 */

//i = mCopyCodeStringToXRAM( mCmdParam.ByteWrite.mByteBuffer, "今天的ADC数据到此结束\xd\xa" ); //mCmdParam.ByteWrite.mByteCount = i; /* 指定本次写入的字节数,单次读写的长度不能超过MAX_BYTE_IO */ //i = CH375ByteWrite( ); /* 以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO */ //mStopIfError( i );

mCmdParam.ByteRead.mByteCount = 10; i = CH375ByteRead( ); /* 以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO */ mStopIfError( i ); P1=mCmdParam.ByteWrite.mByteBuffer;//读第一个字节到P1口显示

mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ i = CH375FileClose( ); /* 关闭文件 */ mStopIfError( i ); mDelaymS( 200 ); return;

}

用上面的程序读U盘中的文件data.txt,其中只有一行,今天的ADC数据到此结束\xd\xa 读第一个字节是46,而不是今的区位码BD F1.不知道为什么?

(1)打开文件,为什么把文件指针移至末尾呢!这肯定读不到第一个字节 (2)P1=mCmdParam.ByteWrite.mByteBuffer应改为: P1=mCmdParam.ByteWrite.mByteBuffer[ 0 ]


谢谢,经您指点解决问题。


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