阅读:9687回复:29
如何发送多个包
请教各位高手,在DRIVERWORK所生成的BULK传输的例子里,如果数据长度大于最大传输包尺寸时只发送一个包,那么如果我想把所有数据都发送出去应该怎么做呢?比如有19个包想放在一帧里发送?
|
|
最新喜欢:![]() |
沙发#
发布于:2001-09-12 01:09
在配置信息中有个最大传输长度,你每次发送的数据不能大于它。
若你的设备上没有存储数据的缓存,每次最多能发128字节(双缓存的情况。) |
|
|
板凳#
发布于:2001-09-12 10:19
那么如果我的设备上有1200字节的缓存,能否一次发送1200个字节的数据?在WINDOWS端需要做什么工作?
每个URB最多包含最大传输包尺寸的数据,那么1200个字节的数据应该怎么操作系统才会把他们作为一个帧的数据在1ms里被传输? 谢谢。 [LIUTANG 编辑于 2001-09-12 10:24] |
|
地板#
发布于:2001-09-12 18:27
当然可以。而且在Windows端不需要做什么工作,仅在URB中设置要传输的长度。在USBD.SYS中,会自动分包发送的。 |
|
|
地下室#
发布于:2001-09-12 19:07
[QUOTE]原本由 LIUTANG 发表
[B] 那么如果我的设备上有1200字节的缓存,能否一次发送1200个字节的数据?在WINDOWS端需要做什么工作? 每个URB最多包含最大传输包尺寸的数据,那么1200个字节的数据应该怎么操作系统才会把他们作为一个帧的数据在1ms里被传输? 谢谢。 [LIUTANG 编辑于 2001-09-12 10:24] [/B][/QUOTE] 这个问题你大概不会得到精确的回答了,因为我已经贴了多时,我的比你还少,只要求10个包。 |
|
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] |
|
|
6楼#
发布于:2001-09-13 15:02
谢谢斑竹.上次没有说清楚,你老人家业务繁忙,我就不计较了.:),没有时间要求只有数据量要求的传输我已经基本弄懂了.
但是能确定在1ms能完成指定数目的数据包吗?我要求最多是10个. [sunkai 编辑于 2001-09-13 15:05] |
|
7楼#
发布于:2001-09-13 20:56
谢谢
|
|
8楼#
发布于:2001-09-16 11:30
[QUOTE]原本由 sunkai 发表
[B]谢谢斑竹.上次没有说清楚,你老人家业务繁忙,我就不计较了.:),没有时间要求只有数据量要求的传输我已经基本弄懂了. 但是能确定在1ms能完成指定数目的数据包吗?我要求最多是10个. [sunkai 编辑于 2001-09-13 15:05] [/B][/QUOTE] 还是BULK传输吗?可能要计算一下了,看看你的firmware的处理速度是否跟得上。driver一次申请10个packet应该没有问题。 |
|
|
9楼#
发布于:2001-09-16 14:25
在实时采集设备中,一般是由硬件控制软件。firmware的处理速度受A/D设备和外存取器等控制(硬件中断握手),采样越快,受控的firmware中填充端点buffer的速度就越快,所以没有处理速度的问题。是主机方的速度跟不上设备,即来不及到设备取数据,导致数据丢失。我做了测试,从最初的发起到数据返回的一系列调用需要用时4-6ms,这样我每次请求6-8ms的数据,要求在后面的那1ms中完成数据的传输,剩下的1ms用于数据的处理,这就是我要求1ms必须完成多个包的原因。现在我的感觉是即使我申请10个packet,但它不一定在1ms内完成,造成了完全混乱的局面,这比世贸中心爆炸给我带来的影响大多了。:(
问题是能确保多包传输在规定的时间内完成吗? |
|
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传输对时间的要求! |
|
|
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端相应的设置必须设置正确",指的是什么?请明示,谢谢. |
|
12楼#
发布于:2001-09-17 23:05
[QUOTE]原本由 DK-boy 发表
BULK传对时间要求不严格的数据传输是有效的。 在空闭的总线上应该没有问题,即无法完成BULK传输对时间的要求! [/B][/QUOTE] 太糟糕了,真搞不懂USB为什么要这样设计.我该这么办? |
|
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吧? |
|
|
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 主机协议栈的。 |
|
|
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] 高手! |
|
|
16楼#
发布于:2001-09-18 20:26
我用cypress的an2131qc芯片,一次发送过64kbytes的包,windows的底层驱动会将其分割。
|
|
|
17楼#
发布于:2001-09-18 20:29
非常谢谢各位!
我的设备已经是用最快的方式来响应主机请求了,firmware中没有任何多余的语句,由硬件决定填充端点的速率,有主机请求就可以应答,在填充端点的速率比较慢的时候会可能出现主机等待设备,在高速率的时候则不会,而是主机根本来不及来读取,导致设备的外存取器数据溢出(用示波器可以看到溢出信号)。 我估测了一下,这样可以达到500-600KB/s,但还是不够10个包/ms,何解? |
|
18楼#
发布于:2001-09-18 20:34
[QUOTE]原本由 singwoo 发表
[B] 顺便说一句,用一个包分析器,你会看的很清楚的。 但话又说回来,带宽的管理是由USBD来实现的。驱动程序无法安 排一个frame中传输10个bulk 包。但是在设备较少的情况下, 一个frame中传输10个bulk 包是没有问题的。 [/B][/QUOTE] 没问题?!太好了,你敢肯定? 谢谢了。我可以安心睡觉了。:) |
|
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。 同步序列由主机产生,设备必须按此同步序列来发送数据。 所以,不存在“主机根本来不及来读取”的问题。 问题在于 你的设备没有与主机同步。 |
|
|
上一页
下一页