CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  硬件/嵌入开发 >  驱动开发/核心开发

USB BULK传输模式如何读进来一个很大的数据包?

楼主yueyahe(James Deng)2006-04-24 15:19:02 在 硬件/嵌入开发 / 驱动开发/核心开发 提问

问题:USB   BULK传输模式如何读进来一个很大的数据包?  
  1、USB   BULK传输模式每帧最大传输64字节,如果我要一次读进来一个很大的数据包(比方说2K)的数据,是否需要我在驱动中组帧(把多个64字节组合起来)?应用程序中组帧?另外一种最好的情况:我不必  
  组包,USB系统自动组织好整个大的数据包后,再通知我(如:以中断的形式)?还是我必须指定读的数据大小(在ReadFile函数中指定,这是我最不愿意发生的事情)?  
   
  2、再请高手对如前述整个过程的实现细节做一全面描述,需要注意的地方敬请不吝笔墨。涉及您不便公开的内容,我恭候在DYONG0329@SINA.COM,不胜感谢!  
   
  环境:Philips   USB器件及FIREWARE(具体实现细节我不懂,也不是我来做的)、Windows下USB驱动(采用DRIVERWORKS开发),BULK传输模式、  
  应用程序采用Win32   API   ReadFile()异步读数据;具体代码如下:  
  1、USB驱动开发采用DRIVERWORKS3.1,Read子例程代码如下:  
  NTSTATUS   TUD310Device::Read(KIrp   I)    
  {  
  t   <<   "Entering   Tud310_USB_DriverDevice::Read,   "   <<   I   <<   EOL;  
  PUCHAR   pBuffer   =   (PUCHAR)   I.BufferedReadDest();//I.IoBuffer()  
  ULONG   dwTotalSize   =   I.ReadSize(CURRENT);  
  ULONG   dwMaxSize   =   m_Endpoint1IN.MaximumTransferSize();  
   
  if   (dwTotalSize   >   dwMaxSize) {  
  ASSERT(dwMaxSize);  
  dwTotalSize   =   dwMaxSize; }  
   
  //   Allocate   a   new   context   structure   for   Irp   completion  
  USB_COMPLETION_INFO*   pCompInfo   =   new   (NonPagedPool)   USB_COMPLETION_INFO;  
  if   (pCompInfo   ==   NULL) {  
  I.Information()   =   0;  
  return   I.PnpComplete(this,   STATUS_INSUFFICIENT_RESOURCES); }  
   
  //   Create   an   URB   to   do   actual   Bulk   read   from   the   pipe  
  PURB   pUrb   =   m_Endpoint1IN.BuildBulkTransfer(  
          pBuffer,             //   Where   is   data   coming   from?  
  dwTotalSize,     //   How   much   data   to   read?  
  TRUE,                   //   direction   (TRUE   =   IN)  
  NULL, //   Link   to   next   URB  
  TRUE //   Allow   a   short   transfer  
  );                  
   
  if   (pUrb   ==   NULL)  
  {  
  delete   pCompInfo;  
  I.Information()   =   0;  
  return   I.PnpComplete(this,   STATUS_INSUFFICIENT_RESOURCES);  
  }  
   
  //   Initialize   context   structure  
  pCompInfo->m_pClass   =   this;  
  pCompInfo->m_pUrb   =   pUrb;  
   
          //   Submit   the   URB   to   our   USB   device  
  NTSTATUS   status;  
  status   =   m_Endpoint1IN.SubmitUrb(I,   pUrb,   LinkTo(ReadComplete),   pCompInfo,   0);  
  return   status;  
  }  
   
  2、应用程序中,读数据代码如下:  
  if   ReadFile(   hUsbFile,lpszInputBuffer^,   dwSizeofBuffer,  
  lpnNumberOfBytesRead,   lpOverlappedRead   )    
  其中参数hUsbFile表示设备句柄、lpszInputBuffer^表示读缓冲区、dwSizeofBuffer读缓冲区的大小  
  、lpnNumberOfBytesRead表示返回字节数的存放地址、lpOverlappedRead已设置异步结构体,我想异步读。 问题点数:100、回复次数:8Top

1 楼lanjun12()回复于 2006-08-24 16:36:45 得分 0

帮你顶,我也在关注这个问题.  
  就是说怎么样把每侦组成一个大的数据包,然后一起读出来.而不用每次读64的字节..Top

2 楼BLUETUNE(蓝色旋律)回复于 2006-08-25 10:33:52 得分 0

先补充一点:USB   BULK   传输对full-speed端点,支持数据包大小可以是8,16,32   或64字节,对high-speed端点,可以支持512字节。  
   
  对于大数据的传输,应该在驱动中把多个block进行组帧。读取数据的长度由应用程序决定,请求发送到驱动后,按上面你的例程描述,在Read(KIrp   I)中分析应用请求读取的数据长度,然后循环发送64字节的USB   Read请求给设备,完成指定长度的数据读取后。   将所有读取数据存储在IRP的output   buffer就可以了。Top

3 楼gates84()回复于 2006-09-14 16:22:53 得分 0

同意楼上的意见。Top

4 楼HZJMAN(龙珠)回复于 2006-10-25 11:39:20 得分 0

没错,应该在驱动中完成Top

5 楼wanyeye(助人者天助)回复于 2006-10-25 11:40:37 得分 0

enTop

6 楼lican990602(Lancelot)回复于 2006-10-26 11:28:43 得分 0

将驱动程序中的BULKUSB_MAX_TRANSFER_SIZE设为1MTop

7 楼linshengfeng(32768)回复于 2006-11-09 00:51:24 得分 0

呵呵.俺的方法是用2个端点.一个用来说明本次包大小.  
  呵呵,俺用DDK写驱动,可惜用DVIVERSTUDIO和WINDRIVER就头大,开发环境总是配不好.本为想懒的懒不成了.Top

8 楼zkking(Reset)回复于 2006-11-09 09:30:39 得分 0

2K而已。开个大缓存,除非你是51搞的,内存不够。Top

相关问题

关键词

得分解答快速导航

  • 帖主:yueyahe

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo