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

数据量大于最大传输尺寸怎么办?

楼主#
更多 发布于:2001-09-13 21:01
    如果发送的数据大于最大传输尺寸,应该如何收发数据?
    例如最大传输尺寸为2048,但我有65536个数据需要传输,肯定是要分成很多次来传输的,这在驱动程序例如何实现?
Pharos
驱动牛犊
驱动牛犊
  • 注册日期2001-08-13
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-09-14 08:20
如果TD中的数据量大于USB设备ED中的MaxPacketSize,那么USB硬件会把数据分成小块进行传输,每次传输MaxPacketSize个Byte,最后一次的包的数据量可能会小于最大包的大小。

(我是做USB低层的,所以只能有低层的观点来解释,希望对你能有一点帮助。)
没有我,你怎么办,你的泪水谁为你擦干; 谁为你打伞,安慰你心寒,失眠的夜你最怕孤单。
DK-boy
驱动中牛
驱动中牛
  • 注册日期2001-07-22
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-09-14 10:53
你应该在驱动程序分为多个irp传送!
喜欢清静?享受人生
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-09-14 12:13
[QUOTE]原本由 LIUTANG 发表
[B]    如果发送的数据大于最大传输尺寸,应该如何收发数据?
    例如最大传输尺寸为2048,但我有65536个数据需要传输,肯定是要分成很多次来传输的,这在驱动程序例如何实现? [/B][/QUOTE]

#define FRAMELEN 2048

int nPackData = 65536 / FRAMELEN;

for(int i = 0; i < nPackData; i++)
{
  WriteDataToUsbPipe("内存首地址" + i * FRAMELEN,FRAMELEN);
  ReadDataFromUsbPipe("内存首地址"+ i * FRAMELEN,FRAMELEN);
}

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2001-09-14 12:55
    如果一个IRP所包含的数据量大于最大传输包尺寸,如何在驱动程序里把此IRP分几次发出去?也就是说只调用一次ReadFile 或WriteFile 就能实现大量数据的读写。我看见DDK的例子里是这么做的,但不知道DRIVERWOR的哪些函数和DDK相对应,哪位老大有这方面经验请多指教,最好给点DRIVERWORK的源代码看看,谢谢!
[LIUTANG 编辑于 2001-09-14 12:59]
DK-boy
驱动中牛
驱动中牛
  • 注册日期2001-07-22
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-09-14 13:09
DDK有例子,
但DriverWorks中不知有没有?

也请DriverWorks的高手出手相助???
喜欢清静?享受人生
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2001-09-14 15:42
    driverwork的帮助文件讲解的似乎不是很详细,有没有相应的书籍?
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-09-14 19:33
[QUOTE]原本由 LIUTANG 发表
[B]    driverwork的帮助文件讲解的似乎不是很详细,有没有相应的书籍? [/B][/QUOTE]

我在上面已经写了DS下的代码,当然WriteDataToUsbPipe和ReadDataFromUsbPipe两个函数必须由你自己写。

也很简单的。

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2001-09-14 19:39
    谢谢大家的帮助,在应用程序这一层用ReadFile和WriteFile多次调用是可以实现的,但我想在驱动程序这一层实现,不知如何入手,虽然说流程很清楚,但苦于不知道用什么函数来实现,各位高手教我。
    在驱动程序这一层实现就可以在ReadFile和WriteFile里指定任意大小的数据量了,否则每次数据量还是不能大于最大传输尺寸。
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2001-09-14 19:54
老兄,我说的也是在驱动程序中。

根据你的这种硬件特性,建议使用DeviceIoControl函数,定义一个IOCTOL码。
在对应的CASE语句中,根据最大传输长度进行分块。进行读写操作。

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2001-09-16 11:15
[QUOTE]原本由 DK-boy 发表
[B]你应该在驱动程序分为多个irp传送! [/B][/QUOTE]
没必要。
一方面是在driver初始化的时候,直接设置max transfer size = 65536,还有就是在WriteFile和ReadFile的时候直接读写65536byte的数据,usbd会自己切分的。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
DK-boy
驱动中牛
驱动中牛
  • 注册日期2001-07-22
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2001-09-17 09:58
[QUOTE]原本由 rayyang2000 发表
[B][QUOTE]原本由 DK-boy 发表
[B]你应该在驱动程序分为多个irp传送! [/B][/QUOTE]
没必要。
一方面是在driver初始化的时候,直接设置max transfer size = 65536,还有就是在WriteFile和ReadFile的时候直接读写65536byte的数据,usbd会自己切分的。 [/B][/QUOTE]

那我再请教一个问题;
能否告知程序中具体如何做?注是用DDK开发的USB驱动。
在Set Report Request中的传输多个字节是否也可以这样做???
[DK-boy 编辑于 2001-09-17 10:19]
喜欢清静?享受人生
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2001-09-17 11:39
    谢谢各位老大的帮助,使小弟学到很多东西,谢谢了
DK-boy
驱动中牛
驱动中牛
  • 注册日期2001-07-22
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2001-09-17 13:24
[QUOTE]原本由 LIUTANG 发表
[B]    谢谢各位老大的帮助,使小弟学到很多东西,谢谢了 [/B][/QUOTE]
看你也是性情中人。
希望多交流!
喜欢清静?享受人生
DK-boy
驱动中牛
驱动中牛
  • 注册日期2001-07-22
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2001-09-17 15:51
[QUOTE]原本由 rayyang2000 发表
[B][QUOTE]原本由 DK-boy 发表
[B]你应该在驱动程序分为多个irp传送! [/B][/QUOTE]
没必要。
一方面是在driver初始化的时候,直接设置max transfer size = 65536,还有就是在WriteFile和ReadFile的时候直接读写65536byte的数据,usbd会自己切分的。 [/B][/QUOTE]
那为什么BulkUSB中为自己来做下面的工作:

// calculate total # of staged irps that will be needed
totalIrpsNeeded =  totalLength / deviceExtension->MaximumTransferSize ;
if ( totalLength % deviceExtension->MaximumTransferSize )
totalIrpsNeeded++;

????
喜欢清静?享受人生
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2001-09-17 19:50
[QUOTE]原本由 LIUTANG 发表
[B]    谢谢各位老大的帮助,使小弟学到很多东西,谢谢了 [/B][/QUOTE]

不用客气,赶快散分。

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2001-09-17 20:31
[QUOTE]原本由 DK-boy 发表
[B]
那为什么BulkUSB中为自己来做下面的工作:

// calculate total # of staged irps that will be needed
totalIrpsNeeded =  totalLength / deviceExtension->MaximumTransferSize ;
if ( totalLength % deviceExtension->MaximumTransferSize )
totalIrpsNeeded++;

????
 [/B][/QUOTE]

如果WriteFile或ReadFile传入的长度大于65536,则分块。

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
DK-boy
驱动中牛
驱动中牛
  • 注册日期2001-07-22
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2001-09-18 11:40
[QUOTE]原本由 LitteSW 发表
[B][QUOTE]原本由 DK-boy 发表
[B]
那为什么BulkUSB中为自己来做下面的工作:

// calculate total # of staged irps that will be needed
totalIrpsNeeded =  totalLength / deviceExtension->MaximumTransferSize ;
if ( totalLength % deviceExtension->MaximumTransferSize )
totalIrpsNeeded++;

????
 [/B][/QUOTE]

如果WriteFile或ReadFile传入的长度大于65536,则分块。

 [/B][/QUOTE]
但是BulkUSB中的deviceExtension->MaximumTransferSize设置为256?为什么不设置为65536?
喜欢清静?享受人生
rapec
驱动牛犊
驱动牛犊
  • 注册日期2001-05-22
  • 最后登录2005-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2001-09-18 18:17
用VC++和Driverworks开发时如何设置MaximumTransferSize=0xffff,
求救!!!!!!!!
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2001-09-19 09:43
据说设置的太大,会在某些情况下让你的机子死的很难看!
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
游客

返回顶部