请问当一次写入大于30个字符,函数CH376WriteReqBlock(buf)返回长度异常

大家好!

最近我在用CH376芯片连接USB写TXT数据,但是无论是中断原地等待还是中断定时查询方式,有问题的都是一个地方,出现在ByteWrite在返回长度上。

UINT8CH376ByteWrite(PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount)  /* 以字节为单位向当前位置写入数据块 */

{

UINT8s;

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) ;  /* 错误 */

}

}

我根据上面这个例程中的函数,转化移植到我的单片机中,当进入while,只有一次机会收到USB_INT_DISK_WRITE(再次发xWriteCH376Cmd(CMD2H_BYTE_WRITE)等 并不会再收到),然后进入下个CH376WriteReqBlock,但是此时只会返回0x1E(也就是USB_INT_DISK_WRITE的值),这样的情况下,并不会真的写30个字节,而是只写了一个字节,就结束了。

不知道什么环节出了问题...

期间还发现一个问题,如果

xWriteCH376Cmd(CMD2H_BYTE_WRITE) ;

xWriteCH376Data((UINT8) ReqCount) ;

xWriteCH376Data((UINT8) (ReqCount>>8) ) 

与Wait376Interrupt() 之间放一个断点时间上不连续,那么只会收到0x14,怎么也收不到0x1E了。

我试过直接断点到CH376FileClose( TRUE ),还是只写了一个字节...

这一个字节是0x11


您好,一个是您操作的文件的文件名是否符合8+3DOS文件名的格式要求?还有就是您说的实际写入了一个字节是否是在整个字节写函数完成退出之后实际在电脑上看到的一个字节?如果是可以尝试一下手册2中的DISK_READY命令刷新U盘自身的缓冲区。还有就是标题中说的大于30字节就会出现只写如一个字节的问题,是否在少于30字节的写入操作都是正确的呢?


首先谢谢楼上的假日回复,我到创建空白TXT文件这一步都是ok的,电脑上每次都能打开创建好的文件的,事实情况是无论写多少个字节,30个字节以下或者以上,我都只在新建的文件里用Notepad ++浏览Hex看到只有一个字节,而这一个字节并不是CH376WriteReqBlock返回给我一个字节的空间,正如我在提问中所描述的,CH376WriteReqBlock依然返回0x1E,好像卡在了上一步的环节,而且我还发现,这种情况下,断点调试时CH376FileClose( TRUE )会卡死在最后的那个中断等待里,虽然不影响这个只有一个字节的文件在USB插入电脑后正常打开,但的确是等不到这个CH376FileClose( TRUE )的中断返回。


您好,我这边试了一下一次写入了30个字节(正常写入U盘),打印了一下返回值,函数如下。

image.png

打印值如下

s wait 1e

s len:1e

s wait 14

“s len”的返回值是由写入字节的多少决定的(写入字节31个,“s len”值就是1f)。可以看出CH376WriteReqBlock返回1e是一个巧合,和USB_INT_DISK_WRITE没有关系。

下面给出一个在 DEMO2008.TXT文件里面写入一段字符的例程,过程是,创建新文件,写入数据,关闭文件。其中LongName2的内容为"This is Long Name File !!.TXT",正好30个字节

s = CH376FileCreate( "/DEMO2008.TXT" ); 
CH376ByteWrite(LongName2,sizeof (LongName2),cont ); 
s=CH376FileClose(TRUE);

您可以把写入数据这部分的完整代码贴出来,我这边帮您看一下


你好,我用你们的例程在STM32的单片机中用等待方式 串口连接 的确没问题,无论是写30个以下字节还是30个以上字节,正确的三个返回值先是0x1E再是长度lengh,最后是写完后的0x14。


但是由于现实情况不允许原地等待中断,只能改成定时查询,然后我发现问题就是集中在第一个s = Wait376Interrupt() 函数分两次查询处理了,然后第二次查询到要么还是0x14,要么就出错了 比如0xB4(文件已关闭),这种情况显然也得不到0x1E,也没有后面的lengh了。


您可以把这部分代码贴出来,我帮您看一下


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