[求助]CH376S函数CH376ByteWrite()问题,未写数据就返回(操作U盘文件)

1、我程序中文件操作程序如下: s=CH376FileOpen("/XP.TXT"); /* 打开文件,该文件在根目录下 */ if(s==USB_INT_SUCCESS) { s=CH376ByteLocate(0xFFFFFFFF); /* 移到文件的尾部 */ mStopIfError(s); } else if(s==ERR_MISS_FILE) { s=CH376FileCreate(NULL); mStopIfError(s); } else mStopIfError(s); /* 打开文件时出错 */

s=sprintf(buf,Txt); /* 注意字符串长度不能溢出buf,否则加大缓冲区或者分多次写入 */ s=CH376ByteWrite(buf,s,NULL); /* 以字节为单位向文件写入数据 */ mStopIfError(s);

mDelayMs(200);

s=sprintf(buf,Txt1); s=CH376ByteWrite(buf,s,NULL);

mStopIfError(s);

s=CH376FileClose(TRUE); /* 关闭文件,自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ mStopIfError(s);

另外:①Txt中实际数据长度为30以内时,进入CH376ByteWrite()函数 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 ); /* 向内部指定缓冲区写入请求的数据块,返回长度 */ xWriteCH376Cmd( CMD0H_BYTE_WR_GO ); xEndCH376Cmd( ); buf += s; if ( RealCount ) *RealCount += s; } /* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* 结束 */ else return( s ); /* 错误 */ } } 第一个循环时,CH376WriteReqBlock( buf )返回30,第二个循环中(写数据完毕,本应返回),返回20,且写入20个0(通过串口监控得到)。在写下一组数据Txt1时,进入CH376ByteWrite()函数后,直接返回,导致实际的第二组数据写不进去。打开U盘看数据,第一组数据正常,第二组数据乱码。 ②当Txt中实际数据长度为超过30(我写的实际长度为60)时,进入CH376ByteWrite()函数后,第一个循环,写入前30个数据,第二个循环没有进入而直接因为超时返回,文件关闭后,拔掉U盘看数据,没有任何数据,只有空文件1个

你上面反馈的是正确的。不是CH376WriteReqBlock返回数据,而是Wait376Interrupt( );的中断状态,按照你上面的说明,第一次写数据返回是0X1E要求你写,第二次你写完之后,返回中断状态为0X14,代表写完成,程序退出了。我不知道你是怎么理解的。


1、第一次Wait376Interrupt( );返回的是0x1e,要求写数据,没错。但是下面的CH376WriteReqBlock( PUINT8 buf )函数返回的0x1e(30),是发送CMD01_WR_REQ_DATA 命令后,返回的允许写入且已经写入的字节数。实际上也是写入了30个数。 UINT8 CH376WriteReqBlock( PUINT8 buf ) /* 向内部指定缓冲区写入请求的数据块,返回长度 */ { UINT8 s, l; xWriteCH376Cmd( CMD01_WR_REQ_DATA ); s = l = xReadCH376Data( ); /* 长度 */ if ( l ) { do { xWriteCH376Data( *buf ); buf ++; } while ( -- l ); } xEndCH376Cmd( ); return( s );

第二次写的时候,实际数据还未写完,但是中断状态却不再是0x1e,所以错误的返回。导致后面的数据写不进去


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