阅读:1781回复:6
请教牛牛们PC机VC实现USB块传输速度慢的问题!!VC关键代码如下: BULK_TRANSFER_CONTROL bulkControl; bulkControl.pipeNum =0; nBytes=0; BOOL bResult= FALSE; DWORD ioctl_val = IOCTL_EZUSB_BULK_WRITE;//预设CTL_CODE参数为写,就是向设备写数据 bResult = DeviceIoControl (m_hDevice,//著名的ioctl函数 ioctl_val,//CTL_CODE参数,标志你是从设备读数据还是向设备写数据 &bulkControl,//传入参数,此处传入要使用的端点号 sizeof (BULK_TRANSFER_CONTROL),//传入参数的大小 aa,//读写数据的缓冲区 512,//读写数据的长度 (unsigned long *)&nBytes,//驱动实际返回的数据长度 NULL); //解释: unsigned char aa[512]; //固体的配置如下: Interface Size 116 Pipe: 0 Type: BLK Endpoint: 2 OUT MaxPktSize: 0x200 Pipe: 1 Type: INT Endpoint: 1 OUT MaxPktSize: 0x40 Pipe: 2 Type: INT Endpoint: 1 IN MaxPktSize: 0x40 Pipe: 3 Type: CTL Endpoint: 0 OUT MaxPktSize: 0x40 Pipe: 4 Type: CTL Endpoint: 0 IN MaxPktSize: 0x40 我通过DeviceIoControl 发送27M的东西需要17秒左右,这样的速度离USB2.0的高速差的太多,而且27M的数据我已经在调用这些函数时是已经打包好的,数据格式是512的正倍数,不存在数据耗时的问题。 请教各位高手,这是什么原因呢?? |
|
沙发#
发布于:2009-11-19 16:12
USB固体是固定的,就只能接收512byte,但是相同的固体环境使用以前的软件版本,传输就可快,具体不能定位问题所在,望各位高手给你指点迷津。
|
|
板凳#
发布于:2009-11-23 08:59
如果驱动是自己写的话,可以改用创建内核模式线程轮询的方式,每个URB包缓冲区设大点,我用的256*1024,速度能上23MB/s。我的理解,固件512一个包,是协议层上的一个包大小,应用层缓冲区可以更大,总线驱动会按协议自己分包。
我也有点困惑,速度就是上不了30MB/s? |
|
地板#
发布于:2009-11-23 09:01
Sorry!我看成IN操作了,估计OUT操作原理也查不多。
|
|
地下室#
发布于:2009-11-24 15:51
你在测试的应用程序中如果用一个线程不停的读取数据的话,cpu会不会一直占用100%呢?
|
|
5楼#
发布于:2009-12-02 10:16
首先:先谢谢各位了!
问题已经找到并解决了,问题出在DeviceIoControl函数调用那里,已经需改传输32M的数据只要45ms,达到公司的要求了!嘿嘿 |
|
6楼#
发布于:2009-12-02 13:29
你这速度也太快了吧,都超过usb的理论传输速度了
|
|