sutian
驱动牛犊
驱动牛犊
  • 注册日期2003-02-10
  • 最后登录2006-04-20
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:3181回复:18

usb bulk传输问题

楼主#
更多 发布于:2003-06-02 19:37
串口接收数据usb bulk传输 接收数据数据长度不是固定的,有时可能是一两个字节,有时更多。并不是时时都有
但我发现bulk传输数据包尺寸为8,16,32,64字节,现在问题就是数据一定要集满一定数量才能送in buffer

如果程序写成

if(RI){IN1BUF=SBUF0;}这种样式的话接收时就会出错,数据会少。

而我希望的是只要串口一有数据,我马上就能从in endpoint里读出,不知有何方法?

最新喜欢:

idlemanidlema...
yjmpepe
驱动牛犊
驱动牛犊
  • 注册日期2003-04-18
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-11 19:35
我的想法是这样的:假设只用了一个端点
1,有突发数据,数据量小于fifo容量,可以将整个包强制发送。用楼上各位的方法可以判断包数据起始。
2,外围来的数据大于一个包,比如楼上说的多了三字节,如果外围没有缓冲而且第二个IRP请求还没来,这三个字节将丢失或有可能用变量暂存。
3,最合理的做法,我认为不应该完全由主机或usb设备来完成突发数据传送以及打包的工作,如果有可能修改串口数据发送方的硬件机制的话,每一段突发数据的起始以及结尾应当由串口发送方来做。如果这个机制无法实现,我还是觉得只能收一个数后马上转发一个数,否则不可能等数据凑够了一个fifo的容量才发送,延迟太大了。

[编辑 -  6/11/03 by  yjmpepe]
sutian
驱动牛犊
驱动牛犊
  • 注册日期2003-02-10
  • 最后登录2006-04-20
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-11 16:24
好像我看到的u盘最少都要发送512字节啊!怎会会65字节那???

就算512个一发,如果文件长515个字节剩下的三个会怎么发呢?

还有一个问题:usb有个busy位,它的置0,置1是自动的,还是手动的
老大说是手动的,但是如果是这样,我在它送东西的时候,把busy
置零是不是会出错?
dalaba
驱动小牛
驱动小牛
  • 注册日期2001-09-12
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望11点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-08 15:43
有一个bulk in端点n,向buffer里写一个字节后向INnBC里写1,字节数并没有达到8,会出现什么现象?会不传输吗?还是最少传8个(一个有效数据加7个无效数据)?
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-08 11:57
他是说我啦。对啊,为什么不能读一个送一个,我也很想知道,还有就是上次我说的u盘送一个65个字节的数据,到最后会多出一个,它是怎么做到数据不丢失的?


好像我看到的u盘最少都要发送512字节啊!怎会会65字节那???
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-07 22:42
呵呵,其实usb的电源一般只够给自己用的,你其它部分的电源还得自己供,我觉得你那种在串口收到一个数就传一个数给主机的方案真不如直接用主机的串口,usb的速度优势只有在传输大量数据是才能显现出来,每个包1个字节甚至有可能比串口还慢呢!
sutian
驱动牛犊
驱动牛犊
  • 注册日期2003-02-10
  • 最后登录2006-04-20
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-07 20:25
要不是usb能提供电源我才不用呢,看个协议就要老长时间,到现在还没搞懂~~~~~~~~~~ :(
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-06-07 13:35
要是收一个发一个,要usb干什么,直接用电脑的串口不就完了,何必费那么大劲加个usb呢,难道是为了赶时髦吗? :D
sutian
驱动牛犊
驱动牛犊
  • 注册日期2003-02-10
  • 最后登录2006-04-20
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-07 13:23
他是说我啦。对啊,为什么不能读一个送一个,我也很想知道,还有就是上次我说的u盘送一个65个字节的数据,到最后会多出一个,它是怎么做到数据不丢失的?
lpwnd
驱动小牛
驱动小牛
  • 注册日期2003-03-04
  • 最后登录2012-01-20
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-05 15:27
是说我吗?
yjmpepe
驱动牛犊
驱动牛犊
  • 注册日期2003-04-18
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-04 19:40
楼上说的很有道理.在c里编程序往文件里写不定长数据通常是应该这么做的.但是大家不觉得楼顶说的
\"如果程序写成if(RI){IN1BUF=SBUF0;}这种样式的话接收时就会出错,数据会少。\"
这难道不是固件上的毛病吗?
数据打包的方法很多,但我觉得以usb的速度收一个串口中断然后往usb传一个数,再启动一个串口中断,这种机制应该是可行的,为何要收了多个数再传送呢?想不通,请高手指点.



lpwnd
驱动小牛
驱动小牛
  • 注册日期2003-03-04
  • 最后登录2012-01-20
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-06-03 18:13
大家注意,我说两句,
把INnBUF的第一字节用于记数,第二节等之后用于存数据,即可实现你说的
sutian
驱动牛犊
驱动牛犊
  • 注册日期2003-02-10
  • 最后登录2006-04-20
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-06-03 15:54
其实我还是想不太通,比如u盘吧,它送的数据不可能正好被8,16,32,64正除吧,比如有一个65个字节的数据,到最后还是会多出一个它是怎么做到数据不丢失的,不会也是补缺吧?? :(至于数据长度他事先知道?

还有就是打包是怎么做的,如果打包的话以后软件对usb操作是不是很复杂。
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-06-03 11:50
楼上说得没错,向这种情况只能用打包的方式!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-06-03 10:18
楼上的想法可行,不过得考虑临界情况,比如数据刚好是8个字节,而且最后一个字节是7,那这个7会不会被舍弃呢,我想着时候可以考虑用16来解决,但最后总会有一些问题,还是让搂住来想吧 :D
bluestar_lww
驱动牛犊
驱动牛犊
  • 注册日期2002-07-15
  • 最后登录2010-09-16
  • 粉丝0
  • 关注0
  • 积分184分
  • 威望19点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-06-03 00:04
不够可以补零,不过有一种危险就是可能你最后一个传输的字节就是零,所以在完善一下,在传输最后一个字节说明这次实传数据的大小。比如传5个字节,缓冲区大小8,传输的数据可以是
X,X,X,X,X,0,0,5。这个方案如何
USB2.0资料,www.fcctec.com
yjmpepe
驱动牛犊
驱动牛犊
  • 注册日期2003-04-18
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-06-02 20:38
我用的68013里可以设置pf标志,可以实现少量数据传输,可以试试收一个数传一个数.
yjmpepe
驱动牛犊
驱动牛犊
  • 注册日期2003-04-18
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-06-02 20:31
出错的原因会不会是uart的中断和usb传输中断两者冲突?
如果实在不行干脆把功能分开,在外围加一个简单的串口片子,然后再将数据写进usb的fifo.做得是傻了点呵呵,不过肯定是管用的。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-06-02 20:02
好像没有太好的方法,这样用int传输好一点吧,但是最少的数据也得是8个字节,鼠标就是用的这种方式。
游客

返回顶部