USB BULK传输模式如何读进来一个很大的数据包?
问题: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




