CH376读的时候一次只能读27个字符,写只能写30个及30个以下的字符

如题 用51单片机(W79E227)的异步串口方式(串口1)

如果 i值28,29,30,31的时候 能读出来28个字符,且不报错顺利通过 如果i值不为这几个数,则要么等待时间特别长(8s左右),要么返回FA超时 一般情况下,小于27的数等待时间特别长,但能读出来,大于32的数,返回FA超时,屏蔽掉报错程序mStopIfError( s );后,同样只可以读出来28个字节的数据

打开文件成功后 s = CH376ByteRead(buf, i, &RealCount ); mStopIfError( s );

另外写的时候 buf里面装的数超过30个的时候就会返回FA超时

新建文件成功后 strcpy( buf, "a1" ); s =CH376ByteWrite( buf, strlen( buf ), NULL ); mStopIfError( s ); 我用的异步串口的方式,改中断等待时间没用,该波特率也没用

可能是什么地方出了错?或者是说这个函数本来就是这样 CH376ByteWrite

CH376ByteRead 都是网站上下载的程序 UINT8 CH376ByteRead( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) /* 以字节为单位从当前位置读取数据块 */ { UINT8 s; xWriteCH376Cmd( CMD2H_BYTE_READ ); xWriteCH376Data( (UINT8)ReqCount ); xWriteCH376Data( (UINT8)(ReqCount>>8) ); // xEndCH376Cmd( ); if ( RealCount ) *RealCount = 0; while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_READ ) { // s = CH376ReadBlock( buf ); /* 从当前主机端点的接收缓冲区读取数据块,返回长度 */ if ( *(PUINT8)&buf ) s = CH376ReadBlockX( buf ); /* 外部RAM */ else s = CH376ReadBlockI( buf ); /* 内部RAM */ xWriteCH376Cmd( CMD0H_BYTE_RD_GO ); // xEndCH376Cmd( ); buf += s; if ( RealCount ) *RealCount += s; } /* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* 结束 */ else return( s ); /* 错误 */ } }

UINT8 CH376ByteWrite( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) /* 以字节为单位向当前位置写入数据块 */ { UINT8 s; xWriteCH376Cmd( CMD2H_BYTE_WRITE ); xWriteCH376Data( (UINT8)ReqCount ); xWriteCH376Data( (UINT8)(ReqCount>>8) ); // xEndCH376Cmd( ); if ( RealCount ) *RealCount = 0; while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_WRITE ) { // s = CH376WriteReqBlock( buf ); /* 向内部指定缓冲区写入请求的数据块,返回长度 */ if ( *(PUINT8)&buf ) s = CH376WriteReqBlockX( buf ); /* 外部RAM */ else s = CH376WriteReqBlockI( buf ); /* 内部RAM */ xWriteCH376Cmd( CMD0H_BYTE_WR_GO ); // xEndCH376Cmd( ); buf += s; if ( RealCount ) *RealCount += s; } /* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* 结束 */ else return( s ); /* 错误 */ } }

另外一个问题:命令里面有一个“继续枚举文件”,也就是枚举下一个文件,那要是想枚举上一个文件该怎么办

1. 需要看一下 完整的工程 2. 可以继续往下枚举,不可以往上枚举。 可以重新枚举


重新枚举的命令是什么?


CH376SetFileName( "\\*" ); /* 设置将要操作的文件的文件名,通配符支持所有文件和子目录 */ xWriteCH376Cmd( CMD0H_FILE_OPEN ); /* 枚举文件和目录 */


我测试了一下 发现原因是, CH376ByteRead函数中的 CH376ReadBlock函数中的

xWriteCH376Cmd( CMD01_RD_USB_DATA0 ); s = l = xReadCH376Data( );

这个s的值为0x1d (表示请求数据输出),十进制即为29 所以 无论每次要求读多少个字,以下的语句 都是按照 29次来循环,导致每次只能读29个字节的情况,请问这种情况怎么解释 if ( l ) { do { *buf = xReadCH376Data( ); buf ++; } while ( -- l ); }


0x1d是一个中断状态,可能是CH376之前返回给单片机的中断状态没有取走,一直保存在单片机的接收SBUF中, 该下面的程序试试 /* 查询CH376中断(INT#低电平) */ UINT8 Query376Interrupt( void ) { unsigned char dat; if ( RI_1 ) ////串口接收标志,串口接收到数据 { dat = SBUF1; //将CH376返回给单片机的中断状态取走,相当清SBUF RI_1 = 0; //清串口标志 RI_1 = 0; //清串口标志 return( TRUE ); } else return( FALSE );

}


方法可行,此 问题已解决


读字节的过程是没错了 ,但是枚举的时候出问题了


枚举的程序请参考CH376EVT.ZIP里面的 EXAM13


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