13241|19

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

在USB同步传输时,怎么判断传输一次数据结束? [复制链接]



在USB同步传输时,怎么判断传输一次数据结束?
此帖出自stm32/stm8论坛

最新回复

                                 8楼活雷锋啊  详情 回复 发表于 2009-11-28 16:52
点赞 关注
 

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 


除了上面的问题,我还有一个:
我的程序是修改keil中虚拟串口的例子。如果我每次从STM32发送的字数小于等于63,那么在电脑的usb端能顺利接受,但如果每次发送的字数正好等于64,那么电脑的usb端只能等到接受到4096字节时才能被ReadFile()函数读出。这一次接受的字节数是4096,我想这些字节是保存在驱动的缓存里了。请大家说说是怎么回事啊?该怎么修改才能每次流畅的接收64字啊。不知道为什么???请大家多多指教。
此帖出自stm32/stm8论坛
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
同步传输结束好像要自己计算,你可以看看官方的音频传输的例子

bulk传输时,一次传输的结束标志有两种
1. 传输的字节少于一个包的大小
2. 传输的字节刚好等于需要的大小

体现就是:
以下用RdFile简称上位机读取数据,Send 表示下位机发送数据
Send 6P   表示发送6包64Bytes的数据
Send 6P32 表示发送6包64Bytes的数据,以及最后一包32Bytes的数据

RdFile 100 -> Send 2P   -> USB设备出现buffer overrun
RdFile 200  -> Send 2P   -> ReadFile函数不返回
RdFile 200  -> Send 3P   -> ReadFile函数不返回
RdFile 200  -> Send 3P1  -> ReadFile函数返回,读取到64*3+1 = 193Bytes数据
RdFile 1024 -> Send 3P   -> ReadFile函数不返回
RdFile 1024 -> Send 3P1  -> ReadFile函数返回,读取到64*3+1 = 193Bytes数据
此帖出自stm32/stm8论坛
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 很有价值。要好好研究下。
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

5
 


如果: 传输的字节刚好等于需要的大小则可判断为结束
那么是不是:
RdFile64-> Send 1P-> ReadFile函数返回,读取到64Bytes数据
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 


刚做了下试验。
RdFile 200  -> Send 2P   -> ReadFile函数不返回
RdFile 200  -> Send 3P   -> ReadFile函数不返回
RdFile 200  -> Send 3P1  -> ReadFile函数返回,读取到64*3+1 = 193Bytes数据
RdFile 1024 -> Send 3P   -> ReadFile函数不返回
RdFile 1024 -> Send 3P1  -> ReadFile函数返回,读取到64*3+1 = 193Bytes数据
都能实现。

RdFile64-> Send 1P-> ReadFile函数返回,读取到64Bytes数据
是不能实现的。继续研究中……
在STM32中怎么判断一次传输结束啊??
假如我的数据大小是64的整数倍,如64*n,那么是不是我先要发n次64,再发一次1Bytes数据就可以了?
这样做在PC端的ReadFile函数可以返回,但我怎么在STM32中判断一次64Bytes传输结束呢??这个比较重要,快来人给看看啊。。。。。。。。
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 上面的问题依旧,又多了个问题,给看看吧。等着用呢。现在数据老是有错,不是丢码,是从STM32传到PC后 有几个字的数据就不对了。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
在USB同步传输时,怎么判断传输一次数据结束?
不知道楼主要问什么,简单地讲一次数据传输结束时会产生一个中断,软件通过在USB寄存器中的对应位判断是哪个端点和哪个事件产生的中断。

STM32_EP_Register.GIF (57.59 KB)

STM32_EP_Register.GIF

此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
刚做了下试验。
可RdFile64-> Send 1P-> ReadFile函数返回,读取到64Bytes数据
是不能实现的。继续研究中……

这个应该是可以返回的
不行的话你可以在后面跟一个大小为0的包

你用的是什么样的驱动程序
你看看DispatchReadWrite这个函数里面创建URB的时候有没有对大小做限制
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 
上面的问题依旧,又多了个问题,给看看吧。等着用呢。现在数据老是有错,不是丢码,是从STM32传到PC后 有几个字的数据就不对了。
楼楼你用BusHound抓包看看有没有什么问题?
几个字节也有可能是STM32其它问题导致的
你可以先发一些相同的数据,比如前面全零,最后一个BYTE递增
看看是否有错以及有无丢包
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 手册我看过了,在usb同步传输时,CTR_TX 是不会置位的,只有第31位可以置位,但2.0的库里面没有找到读取第31位的函数,只有一个clear函数
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

12
 
实在不行就只能用延时了。 现在集中精力解决错码的问题。我觉得错码跟stm32发送的时序有关系。 usb协议不可能这么烂,发个512字的数据就有可能出1个字的错。
又做了下试验RdFile64-> Send 1P-> ReadFile函数返回,读取到64Bytes数据 是可以实现的,
但STM32的程序就挂掉了,再请求数据就不发了。
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 
请问在STM32的USB缓冲区中有数据错误吗?

说了半天你用的什么程序?这几个函数都是哪里来的?RdFile64  ReadFile

怎么越看越糊涂?
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

14
 
请问在STM32的USB缓冲区中有数据错误吗?

说了半天你用的什么程序?这几个函数都是哪里来的?RdFile64  ReadFile

怎么越看越糊涂?
三楼有相关描述
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

15
 
RdFile64  ReadFile 是上位机的读取数据的win32函数。
请问在STM32的USB缓冲区中有数据错误吗?
不知道怎么看USB缓冲区数据
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

16
 
用STM32发32字的数据 ,用BusHound查看到数据有错。
stm32发的数据是0~31 ,可用BusHound查看,有时对,有时错。
20  DI     00 01 02 03 - 04 05 06 07  ........         9us        19.1.0        
                08 09 0a 0b - 0c 0d 0e 0f  ........                    19.1.8        
                10 11 12 13 - 14 15 16 17  ........                    19.1.16      
                18 19 1a 1b - 1c 1d 1e 1f  ........                    19.1.24         
20  DI       00 01 02 03 - 81 07 06 07  ........         9us        21.1.0        
                 08 09 0a 0b - 0c 0d 0e 0f  ........                    21.1.8        
                 10 11 12 13 - 14 15 16 17  ........                    21.1.16      
                 18 19 1a 1b - 1c 1d 1e 1f  ........                    21.1.24      
20  DI     00 01 02 03 - 04 05 06 07  ........         8us        23.1.0        
               08 09 0a 0b - 0c 0d 0e 0f  ........                    23.1.8        
               10 11 12 13 - 14 15 16 17  ........                    23.1.16      
              18 19 1a 1b - a3 07 1e 1f  ........                    23.1.24           
20  DI     00 01 02 03 - 04 05 06 07  ........         8us        25.1.0        
               81 07 1f 08 - 0c 0d 0e 0f  ........                    25.1.8        
              10 11 12 13 - 14 15 16 17  ........                    25.1.16      
              18 19 1a 1b - 1c 1d 1e 1f  ........                    25.1.24   
请大家在帮我看看,谢谢@!
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

17
 
这个是你程序有错了
你的其它USB缓冲有没有可能越界
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

18
 
1、我把程序中类似A|=B;的语句改为A=A|B;错码问题奇怪的好了,
2、通过在最后一个包中发小于64的数据解决了函数返回问题,
3、每一包的时间间隔用的是延时。
程序还在继续优化中,谢谢大家的帮助!
此帖出自stm32/stm8论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

19
 
                                 遇到类似的问题,请把解决方法贴出来共享下
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

20
 
                                 8楼活雷锋啊
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表