usb
来源:互联网 发布:mac 最大化 快捷键 编辑:程序博客网 时间:2024/05/01 14:24
#include <main.h> #include <string.h> #include <stdio.h> #include <avr/io.h> #define usb_cmd (*(volatile unsigned char *)0xa001) #define usb_data (*(volatile unsigned char *)0xa000) #define CMD_SET_USB_MODE 0x15 /* 设置USB工作模式 */ #define CMD_RET_SUCCESS 0x51 /* 命令操作成功 */ #define CMD_RESET_ALL 0x05 /* 执行硬件复位 */ #define CMD_CHECK_EXIST 0x06 /* 测试工作状态 */ #define DISK_CONNECT 0x02 /* 磁盘已经连接,但是尚未初始化或者无法识别该磁盘 */ #define CMD_GET_STATUS 0x22 /* 获取中断状态并取消中断请求 */ #define USB_INT_DISCONNECT 0x16 /* 检测到USB设备断开事件 */ #define USB_INT_CONNECT 0x15 /* 检测到USB设备连接事件 */ #define DISK_DISCONNECT 0x01 /* 磁盘没有连接或者已经断开 */ #define ERR_SUCCESS 0x00 /* 操作成功 */ #define USB_INT_SUCCESS 0x14 /* USB事务或者传输操作成功 */ #define CMD_DISK_INIT 0x51 /* 主机方式: 初始化USB存储器 */ #define CMD_DISK_SIZE 0x53 /* 主机方式: 获取USB存储器的容量 */ #define CMD_DISK_READY 0x59 /* 主机方式: 检查USB存储器就绪 */ #define CMD_DiskReady 0x71 /* 查询磁盘是否准备好 */ #define ERR_MISS_DIR 0xB3 /* 指定路径的某个子目录没有找到,可能是目录名称错误 */ #define CMD_FileOpen 0x10 #define ERR_MISS_FILE 0x42 /* 指定路径的文件没有找到,可能是文件名称错误 */ #define ERR_FOUND_NAME 0x43 /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中,如果需要使用,应该打开该文件 */ #ifndef UINT8 typedef unsigned char UINT8; #endif #ifndef UINT16 typedef unsigned short UINT16; #endif #ifndef UINT32 typedef unsigned long UINT32; #endif #ifndef PUINT8 typedef unsigned char *PUINT8; #endif #define PATH_WILDCARD_CHAR 0x2A /* 路径名的通配符 '*' */ #define PATH_SEPAR_CHAR1 0x5C /* 路径名的分隔符 '\' */ #define PATH_SEPAR_CHAR2 0x2F /* 路径名的分隔符 '/' */ #ifndef MAX_PATH_LEN #define MAX_PATH_LEN 30 /* 最大路径长度,含所有斜杠分隔符和小数点间隔符以及路径结束符00H */ #endif #ifndef MAX_BYTE_IO #define MAX_BYTE_IO ( MAX_PATH_LEN - 1 ) /* 以字节为单位单次读写文件时的最大长度,超过该长度可以分多次读写 */ #endif typedef union _CMD_PARAM { struct { UINT8 mBuffer[ MAX_PATH_LEN ]; } Other; struct { UINT32 mDiskSizeSec; UINT32 mTotalSector; UINT32 mFreeSector; UINT8 mDiskFat; } Query; struct { UINT8 mPathName[ MAX_PATH_LEN ]; } Open; struct { UINT8 mPathName[ MAX_PATH_LEN ]; } Enumer; struct { UINT8 mUpdateLen; } Close; struct { UINT8 mPathName[ MAX_PATH_LEN ]; } Create; struct { UINT8 mPathName[ MAX_PATH_LEN ]; } Erase; struct { UINT32 mFileSize; UINT16 mFileDate; UINT16 mFileTime; UINT8 mFileAttr; } Modify; struct { UINT32 mSectorOffset; } Locate; struct { UINT8 mSectorCount; } Read; struct { UINT8 mSectorCount; } Write; struct { UINT8 mSectorCount; UINT8 mReserved[7]; PUINT8 mDataBuffer; } ReadX; struct { UINT8 mSectorCount; UINT8 mReserved[7]; PUINT8 mDataBuffer; } WriteX; struct { UINT32 mDiskSizeSec; } DiskSize; struct { UINT32 mByteOffset; } ByteLocate; struct { UINT8 mByteCount; UINT8 mByteBuffer[ MAX_BYTE_IO ]; } ByteRead; struct { UINT8 mByteCount; UINT8 mByteBuffer[ MAX_BYTE_IO ]; } ByteWrite; struct { UINT8 mSaveVariable; UINT8 mReserved[3]; PUINT8 mBuffer; } SaveVariable; union { struct { UINT32 mCBW_Sig; UINT32 mCBW_Tag; UINT8 mCBW_DataLen; UINT8 mCBW_DataLen1; UINT8 mCBW_DataLen2; UINT8 mCBW_DataLen3; UINT8 mCBW_Flag; UINT8 mCBW_LUN; UINT8 mCBW_CB_Len; UINT8 mCBW_CB_Buf[6]; } mCBW; struct { UINT32 mCSW_Sig; UINT32 mCSW_Tag; UINT32 mCSW_Residue; UINT8 mCSW_Status; UINT8 mReserved; } mCSW; } BOC; } CMD_PARAM; extern UINT8 CH375DiskStatus; extern UINT8 CH375DiskConnect(void ); extern UINT8 CH375IntStatus; void port_init(void) { DDRA=0XFF; DDRC=0XFF; PORTC&=~0X80; DDRE=0X00; DDRG=0X00; } void CH375_port_init(void) { DDRA=0X00; DDRG=0X00; PORTG=0X1F; DDRC=0X00; PORTC=0X00; DDRE=0XFF; } void init_devices(void) { CLI(); port_init(); CH375_port_init(); MCUCR=0X80; EICRB=0X00; EIMSK|=0X10; SEI(); } void delayms( UINT8 m) { UINT8 i,j; while(m--) {for ( i = 100; i != 0; i -- ) for ( j=10; j!=0; j-- );} } void delay2us( UINT16 m) { UINT8 i; while(m--) {for ( i = 2; i != 0; i -- );} } void xWriteCH375Cmd( UINT8 mCmd ) { delay2us(1); PORTC |= 0x02; PORTA = mCmd; DDRA = 0xFF; PORTG=0X1E; DDRA = 0xFF; DDRA = 0x00; delay2us(1); } UINT8 xReadCH375Data(void) { UINT8 mData; delay2us(1); DDRA = 0x00; PORTC=0x00; PORTG=0X1C; DDRA = 0x00; mData = PINA; return( mData ); } void xWriteCH375Data( UINT8 mData ) { PORTA = mData; DDRA = 0xFF; PORTG=0X1E; PORTC=0x00; DDRA = 0xFF; DDRA = 0x00; delay2us(1); } UINT8 set_usb_mode(UINT8 mode ) { UINT8 i; UINT8 RD_Data; xWriteCH375Cmd(CMD_SET_USB_MODE); delay2us(1); xWriteCH375Data(mode); delay2us(1); for ( i = 100; i != 0; i -- ) { RD_Data=xReadCH375Data(); if( RD_Data == CMD_RET_SUCCESS ) return 1; } return 0; } UINT8 ch375_init(UINT8 mode) { UINT8 i, k; for( k=100; k!=0; k-- ) { xWriteCH375Cmd(CMD_CHECK_EXIST) ; delay2us(1); xWriteCH375Data(0x0f); delay2us(1); i=xReadCH375Data(); if ( 0xf0!= i) { for ( i=5; i!=0; i-- ) xWriteCH375Cmd(CMD_RESET_ALL); delayms(50); } else break; } if( k==0 ) return 0; set_usb_mode( 6 ); return set_usb_mode(mode); } UINT8 CH375LibInit( void ) { CH375LibConfig = LIB_CFG_VALUE; DISK_BASE_BUF[0] = 0; if ( CH375GetVer( ) < CH375_LIB_VER ) return( 0xFF ); return( CH375Init( ) ); } void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; printf( "Error: %02X\n", (UINT16)iError ); } #ifndef NO_DEFAULT_CH375_INT /* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */ #if LIB_CFG_INT_EN == 0 /* CH375的INT#引脚连接方式为"查询方式" */ void xQueryInterrupt( void ) { while ( PINE&0x10 ); xWriteCH375Cmd( CMD_GET_STATUS ); CH375IntStatus = xReadCH375Data( ); if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; } #else /* LIB_CFG_INT_EN != 0, CH375的INT#引脚连接方式为"中断方式" */ void xQueryInterrupt( void ) { while ( CH375IntStatus == 0 ); } void CH375Interrupt( void ) __attribute__ ((signal)); void CH375Interrupt( void ) { xWriteCH375Cmd( CMD_GET_STATUS ); CH375IntStatus = xReadCH375Data( ); if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; #ifdef CLEAR_INT_MARK CLEAR_INT_MARK( ); #endif } #endif #endif UINT8 waitint(void) { while(PINE&0x10); xWriteCH375Cmd(CMD_GET_STATUS); delay2us(2); return xReadCH375Data( ); } UINT8 CH375DiskReady(void ) { xWriteCH375Cmd(CMD_DiskReady); delay2us(2); return xReadCH375Data( ); } UINT8 InitDisk(void) { UINT8 i,Status; xWriteCH375Cmd( CMD_GET_STATUS ); delay2us(1); Status = xReadCH375Data( ); if (Status==USB_INT_DISCONNECT) return Status; delay2us(10); for ( i = 0; i < 10; i ++ ) { delayms( 100) ; if ( CH375DiskReady( ) == USB_INT_SUCCESS ) break; } xWriteCH375Cmd(CMD_DISK_INIT); Status=waitint( ); if (Status!=USB_INT_SUCCESS) return Status; xWriteCH375Cmd(CMD_DISK_SIZE); Status=waitint( ); if (Status!=USB_INT_SUCCESS) { delayms(250); xWriteCH375Cmd(CMD_DISK_SIZE); Status=waitint( ); } if (Status!=USB_INT_SUCCESS) return Status; return 1; } UINT8 CH375FileOpen( ) {xWriteCH375Cmd(CMD_FileOpen); delay2us(2); return xReadCH375Data( ); } int main(void ) { UINT8 i, c; UINT8 *pCodeStr; UINT16 TotalCount; port_init(); CH375_port_init(); init_devices(); delay2us(10); CH375LibInit( ) c=ch375_init(6); while(c!=1) {for( i=5; i!=0; i-- ) c=ch375_init(6); delayms(50); } while ( 1 ) { while ( CH375DiskStatus < DISK_CONNECT ) { if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; delayms(100); } delayms(200);; } InitDisk(); printf( "Open\n" ); strcpy(CMD_PARAM.Open.mPathName, "/C51/CH375HFT.C" ); i = CH375FileOpen( ); if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { if ( i == ERR_MISS_DIR ) pCodeStr = (UINT8 *)"/*"; /* C51子目录不存在则列出根目录下的文件 */ else pCodeStr = (UINT8 *)"/C51/CH375*"; printf( "List file %s\n", pCodeStr ); for ( c = 0; c < 254; c ++ ) { strcpy( (char *)CMD_PARAM.Open.mPathName, (char *)pCodeStr ); i = strlen( (char *)CMD_PARAM.Open.mPathName ); CMD_PARAM.Open.mPathName[ i ] = c; i = CH375FileOpen( ); if ( i == ERR_MISS_FILE ) break; if ( i == ERR_FOUND_NAME ) { printf( " match file %03d#: %s\n", (unsigned int)c, CMD_PARAM.Open.mPathName ); continue; } else { mStopIfError( i ); break; } } } else { mStopIfError( i ); TotalCount = 600; printf( "从文件中读出的前%d个字符是:\n",TotalCount ); while ( TotalCount ) { if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO; else c = TotalCount; CMD_PARAM.ByteRead.mByteCount = c; i = CH375ByteRead( ); mStopIfError( i ); TotalCount -=CMD_PARAM.ByteRead.mByteCount; for ( i=0; i!=CMD_PARAM.ByteRead.mByteCount; i++ ) {printf( "%c", CMD_PARAM.ByteRead.mByteBuffer[i] ); } if ( CMD_PARAM.ByteRead.mByteCount < c ) { printf( "\n" ); printf( "文件已经结束\n" ); break; } } } } #include <main.h> #include <string.h> #include <stdio.h> #include <avr/io.h> #define usb_cmd (*(volatile unsigned char *)0xa001) #define usb_data (*(volatile unsigned char *)0xa000) #define CMD_SET_USB_MODE 0x15 /* 设置USB工作模式 */ #define CMD_RET_SUCCESS 0x51 /* 命令操作成功 */ #define CMD_RESET_ALL 0x05 /* 执行硬件复位 */ #define CMD_CHECK_EXIST 0x06 /* 测试工作状态 */ #define DISK_CONNECT 0x02 /* 磁盘已经连接,但是尚未初始化或者无法识别该磁盘 */ #define CMD_GET_STATUS 0x22 /* 获取中断状态并取消中断请求 */ #define USB_INT_DISCONNECT 0x16 /* 检测到USB设备断开事件 */ #define USB_INT_CONNECT 0x15 /* 检测到USB设备连接事件 */ #define DISK_DISCONNECT 0x01 /* 磁盘没有连接或者已经断开 */ #define ERR_SUCCESS 0x00 /* 操作成功 */ #define USB_INT_SUCCESS 0x14 /* USB事务或者传输操作成功 */ #define CMD_DISK_INIT 0x51 /* 主机方式: 初始化USB存储器 */ #define CMD_DISK_SIZE 0x53 /* 主机方式: 获取USB存储器的容量 */ #define CMD_DISK_READY 0x59 /* 主机方式: 检查USB存储器就绪 */ #define CMD_DiskReady 0x71 /* 查询磁盘是否准备好 */ #define ERR_MISS_DIR 0xB3 /* 指定路径的某个子目录没有找到,可能是目录名称错误 */ #define CMD_FileOpen 0x10 #define ERR_MISS_FILE 0x42 /* 指定路径的文件没有找到,可能是文件名称错误 */ #define ERR_FOUND_NAME 0x43 /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中,如果需要使用,应该打开该文件 */ #ifndef UINT8 typedef unsigned char UINT8; #endif #ifndef UINT16 typedef unsigned short UINT16; #endif #ifndef UINT32 typedef unsigned long UINT32; #endif #ifndef PUINT8 typedef unsigned char *PUINT8; #endif #define PATH_WILDCARD_CHAR 0x2A /* 路径名的通配符 '*' */ #define PATH_SEPAR_CHAR1 0x5C /* 路径名的分隔符 '\' */ #define PATH_SEPAR_CHAR2 0x2F /* 路径名的分隔符 '/' */ #ifndef MAX_PATH_LEN #define MAX_PATH_LEN 30 /* 最大路径长度,含所有斜杠分隔符和小数点间隔符以及路径结束符00H */ #endif #ifndef MAX_BYTE_IO #define MAX_BYTE_IO ( MAX_PATH_LEN - 1 ) /* 以字节为单位单次读写文件时的最大长度,超过该长度可以分多次读写 */ #endif typedef union _CMD_PARAM { struct { UINT8 mBuffer[ MAX_PATH_LEN ]; } Other; struct { UINT32 mDiskSizeSec; UINT32 mTotalSector; UINT32 mFreeSector; UINT8 mDiskFat; } Query; struct { UINT8 mPathName[ MAX_PATH_LEN ]; } Open; struct { UINT8 mPathName[ MAX_PATH_LEN ]; } Enumer; struct { UINT8 mUpdateLen; } Close; struct { UINT8 mPathName[ MAX_PATH_LEN ]; } Create; struct { UINT8 mPathName[ MAX_PATH_LEN ]; } Erase; struct { UINT32 mFileSize; UINT16 mFileDate; UINT16 mFileTime; UINT8 mFileAttr; } Modify; struct { UINT32 mSectorOffset; } Locate; struct { UINT8 mSectorCount; } Read; struct { UINT8 mSectorCount; } Write; struct { UINT8 mSectorCount; UINT8 mReserved[7]; PUINT8 mDataBuffer; } ReadX; struct { UINT8 mSectorCount; UINT8 mReserved[7]; PUINT8 mDataBuffer; } WriteX; struct { UINT32 mDiskSizeSec; } DiskSize; struct { UINT32 mByteOffset; } ByteLocate; struct { UINT8 mByteCount; UINT8 mByteBuffer[ MAX_BYTE_IO ]; } ByteRead; struct { UINT8 mByteCount; UINT8 mByteBuffer[ MAX_BYTE_IO ]; } ByteWrite; struct { UINT8 mSaveVariable; UINT8 mReserved[3]; PUINT8 mBuffer; } SaveVariable; union { struct { UINT32 mCBW_Sig; UINT32 mCBW_Tag; UINT8 mCBW_DataLen; UINT8 mCBW_DataLen1; UINT8 mCBW_DataLen2; UINT8 mCBW_DataLen3; UINT8 mCBW_Flag; UINT8 mCBW_LUN; UINT8 mCBW_CB_Len; UINT8 mCBW_CB_Buf[6]; } mCBW; struct { UINT32 mCSW_Sig; UINT32 mCSW_Tag; UINT32 mCSW_Residue; UINT8 mCSW_Status; UINT8 mReserved; } mCSW; } BOC; } CMD_PARAM; extern UINT8 CH375DiskStatus; extern UINT8 CH375DiskConnect(void ); extern UINT8 CH375IntStatus; void port_init(void) { DDRA=0XFF; DDRC=0XFF; PORTC&=~0X80; DDRE=0X00; DDRG=0X00; } void CH375_port_init(void) { DDRA=0X00; DDRG=0X00; PORTG=0X1F; DDRC=0X00; PORTC=0X00; DDRE=0XFF; } void init_devices(void) { CLI(); port_init(); CH375_port_init(); MCUCR=0X80; EICRB=0X00; EIMSK|=0X10; SEI(); } void delayms( UINT8 m) { UINT8 i,j; while(m--) {for ( i = 100; i != 0; i -- ) for ( j=10; j!=0; j-- );} } void delay2us( UINT16 m) { UINT8 i; while(m--) {for ( i = 2; i != 0; i -- );} } void xWriteCH375Cmd( UINT8 mCmd ) { delay2us(1); PORTC |= 0x02; PORTA = mCmd; DDRA = 0xFF; PORTG=0X1E; DDRA = 0xFF; DDRA = 0x00; delay2us(1); } UINT8 xReadCH375Data(void) { UINT8 mData; delay2us(1); DDRA = 0x00; PORTC=0x00; PORTG=0X1C; DDRA = 0x00; mData = PINA; return( mData ); } void xWriteCH375Data( UINT8 mData ) { PORTA = mData; DDRA = 0xFF; PORTG=0X1E; PORTC=0x00; DDRA = 0xFF; DDRA = 0x00; delay2us(1); } UINT8 set_usb_mode(UINT8 mode ) { UINT8 i; UINT8 RD_Data; xWriteCH375Cmd(CMD_SET_USB_MODE); delay2us(1); xWriteCH375Data(mode); delay2us(1); for ( i = 100; i != 0; i -- ) { RD_Data=xReadCH375Data(); if( RD_Data == CMD_RET_SUCCESS ) return 1; } return 0; } UINT8 ch375_init(UINT8 mode) { UINT8 i, k; for( k=100; k!=0; k-- ) { xWriteCH375Cmd(CMD_CHECK_EXIST) ; delay2us(1); xWriteCH375Data(0x0f); delay2us(1); i=xReadCH375Data(); if ( 0xf0!= i) { for ( i=5; i!=0; i-- ) xWriteCH375Cmd(CMD_RESET_ALL); delayms(50); } else break; } if( k==0 ) return 0; set_usb_mode( 6 ); return set_usb_mode(mode); } UINT8 CH375LibInit( void ) { CH375LibConfig = LIB_CFG_VALUE; DISK_BASE_BUF[0] = 0; if ( CH375GetVer( ) < CH375_LIB_VER ) return( 0xFF ); return( CH375Init( ) ); } void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; printf( "Error: %02X\n", (UINT16)iError ); } #ifndef NO_DEFAULT_CH375_INT /* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */ #if LIB_CFG_INT_EN == 0 /* CH375的INT#引脚连接方式为"查询方式" */ void xQueryInterrupt( void ) { while ( PINE&0x10 ); xWriteCH375Cmd( CMD_GET_STATUS ); CH375IntStatus = xReadCH375Data( ); if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; } #else /* LIB_CFG_INT_EN != 0, CH375的INT#引脚连接方式为"中断方式" */ void xQueryInterrupt( void ) { while ( CH375IntStatus == 0 ); } void CH375Interrupt( void ) __attribute__ ((signal)); void CH375Interrupt( void ) { xWriteCH375Cmd( CMD_GET_STATUS ); CH375IntStatus = xReadCH375Data( ); if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; #ifdef CLEAR_INT_MARK CLEAR_INT_MARK( ); #endif } #endif #endif UINT8 waitint(void) { while(PINE&0x10); xWriteCH375Cmd(CMD_GET_STATUS); delay2us(2); return xReadCH375Data( ); } UINT8 CH375DiskReady(void ) { xWriteCH375Cmd(CMD_DiskReady); delay2us(2); return xReadCH375Data( ); } UINT8 InitDisk(void) { UINT8 i,Status; xWriteCH375Cmd( CMD_GET_STATUS ); delay2us(1); Status = xReadCH375Data( ); if (Status==USB_INT_DISCONNECT) return Status; delay2us(10); for ( i = 0; i < 10; i ++ ) { delayms( 100) ; if ( CH375DiskReady( ) == USB_INT_SUCCESS ) break; } xWriteCH375Cmd(CMD_DISK_INIT); Status=waitint( ); if (Status!=USB_INT_SUCCESS) return Status; xWriteCH375Cmd(CMD_DISK_SIZE); Status=waitint( ); if (Status!=USB_INT_SUCCESS) { delayms(250); xWriteCH375Cmd(CMD_DISK_SIZE); Status=waitint( ); } if (Status!=USB_INT_SUCCESS) return Status; return 1; } UINT8 CH375FileOpen( ) {xWriteCH375Cmd(CMD_FileOpen); delay2us(2); return xReadCH375Data( ); } int main(void ) { UINT8 i, c; UINT8 *pCodeStr; UINT16 TotalCount; port_init(); CH375_port_init(); init_devices(); delay2us(10); CH375LibInit( ) c=ch375_init(6); while(c!=1) {for( i=5; i!=0; i-- ) c=ch375_init(6); delayms(50); } while ( 1 ) { while ( CH375DiskStatus < DISK_CONNECT ) { if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; delayms(100); } delayms(200);; } InitDisk(); printf( "Open\n" ); strcpy(CMD_PARAM.Open.mPathName, "/C51/CH375HFT.C" ); i = CH375FileOpen( ); if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { if ( i == ERR_MISS_DIR ) pCodeStr = (UINT8 *)"/*"; /* C51子目录不存在则列出根目录下的文件 */ else pCodeStr = (UINT8 *)"/C51/CH375*"; printf( "List file %s\n", pCodeStr ); for ( c = 0; c < 254; c ++ ) { strcpy( (char *)CMD_PARAM.Open.mPathName, (char *)pCodeStr ); i = strlen( (char *)CMD_PARAM.Open.mPathName ); CMD_PARAM.Open.mPathName[ i ] = c; i = CH375FileOpen( ); if ( i == ERR_MISS_FILE ) break; if ( i == ERR_FOUND_NAME ) { printf( " match file %03d#: %s\n", (unsigned int)c, CMD_PARAM.Open.mPathName ); continue; } else { mStopIfError( i ); break; } } } else { mStopIfError( i ); TotalCount = 600; printf( "从文件中读出的前%d个字符是:\n",TotalCount ); while ( TotalCount ) { if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO; else c = TotalCount; CMD_PARAM.ByteRead.mByteCount = c; i = CH375ByteRead( ); mStopIfError( i ); TotalCount -=CMD_PARAM.ByteRead.mByteCount; for ( i=0; i!=CMD_PARAM.ByteRead.mByteCount; i++ ) {printf( "%c", CMD_PARAM.ByteRead.mByteBuffer[i] ); } if ( CMD_PARAM.ByteRead.mByteCount < c ) { printf( "\n" ); printf( "文件已经结束\n" ); break; } } } }