LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:9687回复:29

如何发送多个包

楼主#
更多 发布于:2001-09-11 19:28
    请教各位高手,在DRIVERWORK所生成的BULK传输的例子里,如果数据长度大于最大传输包尺寸时只发送一个包,那么如果我想把所有数据都发送出去应该怎么做呢?比如有19个包想放在一帧里发送?

最新喜欢:

worldwarworldw...
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-09-12 01:09
在配置信息中有个最大传输长度,你每次发送的数据不能大于它。

若你的设备上没有存储数据的缓存,每次最多能发128字节(双缓存的情况。)

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2001-09-12 10:19
    那么如果我的设备上有1200字节的缓存,能否一次发送1200个字节的数据?在WINDOWS端需要做什么工作?
    每个URB最多包含最大传输包尺寸的数据,那么1200个字节的数据应该怎么操作系统才会把他们作为一个帧的数据在1ms里被传输?
    谢谢。
[LIUTANG 编辑于 2001-09-12 10:24]
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-09-12 18:27

当然可以。而且在Windows端不需要做什么工作,仅在URB中设置要传输的长度。在USBD.SYS中,会自动分包发送的。
穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-09-12 19:07
[QUOTE]原本由 LIUTANG 发表
[B]    那么如果我的设备上有1200字节的缓存,能否一次发送1200个字节的数据?在WINDOWS端需要做什么工作?
    每个URB最多包含最大传输包尺寸的数据,那么1200个字节的数据应该怎么操作系统才会把他们作为一个帧的数据在1ms里被传输?
    谢谢。
[LIUTANG 编辑于 2001-09-12 10:24] [/B][/QUOTE]
这个问题你大概不会得到精确的回答了,因为我已经贴了多时,我的比你还少,只要求10个包。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-09-13 09:22
[QUOTE]原本由 sunkai 发表
[B][QUOTE]原本由 LIUTANG 发表
[B]    那么如果我的设备上有1200字节的缓存,能否一次发送1200个字节的数据?在WINDOWS端需要做什么工作?
    每个URB最多包含最大传输包尺寸的数据,那么1200个字节的数据应该怎么操作系统才会把他们作为一个帧的数据在1ms里被传输?
    谢谢。
[LIUTANG 编辑于 2001-09-12 10:24] [/B][/QUOTE]
这个问题你大概不会得到精确的回答了,因为我已经贴了多时,我的比你还少,只要求10个包。 [/B][/QUOTE]
上次是我和你讨论的吧?
后来我做过了一下研究,发现是这样的:
windows默认的设置是4096个bytes。usb client driver可以一次请求最大4096个bytes的数据传输,usbd.sys会自动的把这些数据按照对应的pipe的传输能力进行切割,一小块、一小块的传输。
例如,如果设备端有一个BULK IN端点的buffer长度是128bytes,usb client driver可以一次请求读取4096bytes的数据,usbd.sys会自己把这4096bytes分成4096/128 = 32个BULK IN Request,然后把每个request单独发送。全部都发送完了以后,再一次性的把这4096个数据都返回给client driver。
另外,可以通过程序将4096增加到65536。
[rayyang2000 编辑于 2001-09-13 09:27]
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-09-13 15:02
谢谢斑竹.上次没有说清楚,你老人家业务繁忙,我就不计较了.:),没有时间要求只有数据量要求的传输我已经基本弄懂了.
但是能确定在1ms能完成指定数目的数据包吗?我要求最多是10个.
[sunkai 编辑于 2001-09-13 15:05]
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2001-09-13 20:56
谢谢
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2001-09-16 11:30
[QUOTE]原本由 sunkai 发表
[B]谢谢斑竹.上次没有说清楚,你老人家业务繁忙,我就不计较了.:),没有时间要求只有数据量要求的传输我已经基本弄懂了.
但是能确定在1ms能完成指定数目的数据包吗?我要求最多是10个.
[sunkai 编辑于 2001-09-13 15:05] [/B][/QUOTE]
还是BULK传输吗?可能要计算一下了,看看你的firmware的处理速度是否跟得上。driver一次申请10个packet应该没有问题。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2001-09-16 14:25
在实时采集设备中,一般是由硬件控制软件。firmware的处理速度受A/D设备和外存取器等控制(硬件中断握手),采样越快,受控的firmware中填充端点buffer的速度就越快,所以没有处理速度的问题。是主机方的速度跟不上设备,即来不及到设备取数据,导致数据丢失。我做了测试,从最初的发起到数据返回的一系列调用需要用时4-6ms,这样我每次请求6-8ms的数据,要求在后面的那1ms中完成数据的传输,剩下的1ms用于数据的处理,这就是我要求1ms必须完成多个包的原因。现在我的感觉是即使我申请10个packet,但它不一定在1ms内完成,造成了完全混乱的局面,这比世贸中心爆炸给我带来的影响大多了。:(
问题是能确保多包传输在规定的时间内完成吗?
DK-boy
驱动中牛
驱动中牛
  • 注册日期2001-07-22
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2001-09-17 17:44
[QUOTE]原本由 sunkai 发表
[B]在实时采集设备中,一般是由硬件控制软件。firmware的处理速度受A/D设备和外存取器等控制(硬件中断握手),采样越快,受控的firmware中填充端点buffer的速度就越快,所以没有处理速度的问题。是主机方的速度跟不上设备,即来不及到设备取数据,导致数据丢失。我做了测试,从最初的发起到数据返回的一系列调用需要用时4-6ms,这样我每次请求6-8ms的数据,要求在后面的那1ms中完成数据的传输,剩下的1ms用于数据的处理,这就是我要求1ms必须完成多个包的原因。现在我的感觉是即使我申请10个packet,但它不一定在1ms内完成,造成了完全混乱的局面,这比世贸中心爆炸给我带来的影响大多了。:(
问题是能确保多包传输在规定的时间内完成吗? [/B][/QUOTE]
BULK传对时间要求不严格的数据传输是有效的。
在空闭的总线上应该没有问题,即无法完成BULK传输对时间的要求!
喜欢清静?享受人生
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2001-09-17 23:02
[QUOTE]原本由 无心快语 发表
[B]在usbn9604的wdm层你可以在对设备的初始化中这样来设置
m_endpointxin.initialize(m_lower,0x8x,maxsize);
其中maxsize是所要发送的数据的字节数(必须大于64)
在接收的时候把接收的urb中的length值设置为maxsize即可
但usb端相应的设置必须设置正确

 [/B][/QUOTE]
设置maxsize我已经完成了,"但usb端相应的设置必须设置正确",指的是什么?请明示,谢谢.
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2001-09-17 23:05
[QUOTE]原本由 DK-boy 发表
BULK传对时间要求不严格的数据传输是有效的。
在空闭的总线上应该没有问题,即无法完成BULK传输对时间的要求! [/B][/QUOTE]
太糟糕了,真搞不懂USB为什么要这样设计.我该这么办?
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2001-09-18 10:06
[QUOTE]原本由 sunkai 发表
[B][QUOTE]原本由 无心快语 发表
[B]在usbn9604的wdm层你可以在对设备的初始化中这样来设置
m_endpointxin.initialize(m_lower,0x8x,maxsize);
其中maxsize是所要发送的数据的字节数(必须大于64)
在接收的时候把接收的urb中的length值设置为maxsize即可
但usb端相应的设置必须设置正确

 [/B][/QUOTE]
设置maxsize我已经完成了,"但usb端相应的设置必须设置正确",指的是什么?请明示,谢谢. [/B][/QUOTE]
应该是firmware的endpoint descriptor吧?
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
singwoo
驱动牛犊
驱动牛犊
  • 注册日期2001-09-10
  • 最后登录2002-02-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2001-09-18 12:30

主要原因在于你的DEVICE上。是你的设备来不及处理主机的要求。

我的一个测试如下:
我的设备比较快,一个FRAME 中有94个bulk 包,数据量为6Kb/ms。
相当于6Mb/s。即便如此快,主机的发送请求与设备的响应(指带数据的响应,不是NAK)的比例是3:1(一个FRAME中)。可见主机的响应有多快!

顺便说一句,用一个包分析器,你会看的很清楚的。

但话又说回来,带宽的管理是由USBD来实现的。驱动程序无法安
排一个frame中传输10个bulk 包。但是在设备较少的情况下,
一个frame中传输10个bulk 包是没有问题的。

我没有具体做过USB DEVICE,只做USB 主机协议栈的。

singwoo
DK-boy
驱动中牛
驱动中牛
  • 注册日期2001-07-22
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2001-09-18 13:29
[QUOTE]原本由 singwoo 发表
[B]
主要原因在于你的DEVICE上。是你的设备来不及处理主机的要求。

我的一个测试如下:
我的设备比较快,一个FRAME 中有94个bulk 包,数据量为6Kb/ms。
相当于6Mb/s。即便如此快,主机的发送请求与设备的响应(指带数据的响应,不是NAK)的比例是3:1(一个FRAME中)。可见主机的响应有多快!

顺便说一句,用一个包分析器,你会看的很清楚的。

但话又说回来,带宽的管理是由USBD来实现的。驱动程序无法安
排一个frame中传输10个bulk 包。但是在设备较少的情况下,
一个frame中传输10个bulk 包是没有问题的。

我没有具体做过USB DEVICE,只做USB 主机协议栈的。

 [/B][/QUOTE]
高手!
喜欢清静?享受人生
study
驱动牛犊
驱动牛犊
  • 注册日期2001-05-14
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2001-09-18 20:26
我用cypress的an2131qc芯片,一次发送过64kbytes的包,windows的底层驱动会将其分割。
学无止境
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2001-09-18 20:29
非常谢谢各位!
我的设备已经是用最快的方式来响应主机请求了,firmware中没有任何多余的语句,由硬件决定填充端点的速率,有主机请求就可以应答,在填充端点的速率比较慢的时候会可能出现主机等待设备,在高速率的时候则不会,而是主机根本来不及来读取,导致设备的外存取器数据溢出(用示波器可以看到溢出信号)。
我估测了一下,这样可以达到500-600KB/s,但还是不够10个包/ms,何解?
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2001-09-18 20:34
[QUOTE]原本由 singwoo 发表
[B]

顺便说一句,用一个包分析器,你会看的很清楚的。

但话又说回来,带宽的管理是由USBD来实现的。驱动程序无法安
排一个frame中传输10个bulk 包。但是在设备较少的情况下,
一个frame中传输10个bulk 包是没有问题的。

 [/B][/QUOTE]
没问题?!太好了,你敢肯定?
谢谢了。我可以安心睡觉了。:)
singwoo
驱动牛犊
驱动牛犊
  • 注册日期2001-09-10
  • 最后登录2002-02-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2001-09-19 09:26
to sunkai:
   很佩服你对USB钻研的那么细。
“主机根本来不及来读取,导致设备的外存取器数据溢出(用示波器可以看到溢出信号)。
我估测了一下,这样可以达到500-600KB/s,但还是不够10个包/ms,何解?”
   我的愚见是:
BULK IN 事务的过程如下:
1。主机发送IN 令牌,EOP后,等待设备DATA包。
2。设备接到令牌后按令牌中的同步序列发送DATA,EOP。
3。主机收到DATA后,发送ACK。

同步序列由主机产生,设备必须按此同步序列来发送数据。
所以,不存在“主机根本来不及来读取”的问题。 问题在于
你的设备没有与主机同步。

singwoo
上一页
游客

返回顶部