完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好!
最近我在用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 |
|
相关推荐
4个回答
|
|
您好,一个是您操作的文件的文件名是否符合8+3DOS文件名的格式要求?还有就是您说的实际写入了一个字节是否是在整个字节写函数完成退出之后实际在电脑上看到的一个字节?如果是可以尝试一下手册2中的DISK_READY命令刷新U盘自身的缓冲区。还有就是标题中说的大于30字节就会出现只写如一个字节的问题,是否在少于30字节的写入操作都是正确的呢?
|
|
|
|
首先谢谢楼上的假日回复,我到创建空白TXT文件这一步都是ok的,电脑上每次都能打开创建好的文件的,事实情况是无论写多少个字节,30个字节以下或者以上,我都只在新建的文件里用Notepad ++浏览Hex看到只有一个字节,而这一个字节并不是CH376WriteReqBlock返回给我一个字节的空间,正如我在提问中所描述的,CH376WriteReqBlock依然返回0x1E,好像卡在了上一步的环节,而且我还发现,这种情况下,断点调试时CH376FileClose( TRUE )会卡死在最后的那个中断等待里,虽然不影响这个只有一个字节的文件在USB插入电脑后正常打开,但的确是等不到这个CH376FileClose( TRUE )的中断返回。
|
|
|
|
您好,我这边试了一下一次写入了30个字节(正常写入U盘),打印了一下返回值,函数如下。
打印值如下 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。
|
|
|
|
只有小组成员才能发言,加入小组>>
534 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2910 浏览 2 评论
2404 浏览 1 评论
880浏览 2评论
695浏览 1评论
riscv-none-embed-objcopy: \'PWM_Output.elf\': No such file这个咋解决,
423浏览 1评论
538浏览 1评论
请教一下,Mounriver 编译不成功:找不到库文件,怎么整
821浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 08:31 , Processed in 1.076827 second(s), Total 82, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号