阅读:8833回复:8
28分求教:CreateFile打开PIPE00偶尔出错,最后错误代码87
接手调试一个mp3固件更新程序。系统是基于T6280的,关于TT6280网上有如下说明:
珠海科广 T6284、T6282/T6280/T6270 分别面向高端、中端和低端市场。T6280不仅将DSP、可编程MCU和USB控制器结合在一起,还集成了ADC、LCD驱动器和音频编解码器。目前用的工厂较少,市面上仿JNC的圆筒机就是用到这个方案,还未完全完善。 公司似已被扬智收入旗下,网上已查不器件到相关信息。根据前辈口述,系统工作流程如下(实验板):系统上电检测到没有程序->从USB接收2046B代码->自动重启从这段代码开始执行->接收Firmware主程序->结束。 //----------------------------------------------- 关键代码如下(基于VC6/DDK2K): //开始 传输前导段; 通过CreateFile(\"\\\\.\\...\\PIPE01\")、DeviceIoControl()获取设备版本,判断设备关机然后又启动; //开始传输固件部分 从bin文件读取4096B并写入buf; //打开设备的0端点 if((h = CreateFile(\"\\\\.\\...\\PIPE00\")) == INVALID_HANDLE_VALUE) { return ERROR; } //在指定位置擦除指定长度 if(DeviceIoControl(hHandle, IOCTL_VENDOR_SIGNAL_DOWNLOAD, //... ) == FALSE) { return ERROR; } //传送写命令,包含位置和长度 if(DeviceIoControl(hHandle, IOCTL_VENDOR_SIGNAL_DOWNLOAD, //... ) == FALSE) { return ERROR; } //异步写入USB bReturnValue = WriteFileEx( hHandle, // handle to output file pBuf, // data buffer Len, // number of bytes to write pOverLapped, // overlapped buffer FileIOCompletionRoutine // completion routine ); 如果未传送完回到读取文件处循环执行; //结束 以上代码只包含了最底层的调用,实际中是在传输线程中通过层层调用执行的,而且前后都有相关服务、异常处理代码,比如CreateFile前都有GetUsbDeviceFileName()的调用,然后把对应管道名称追加上,最后才调用CreateFile。 问题是,在总共500多次循环中,偶尔会有CreateFile(\"\\\\.\\...\\PIPE00\")执行失败,返回错误代码都是87,无效参数。而异步写入的相关方法返回值显示成功完成了4096B的数据传输。一般完全成功的都是在长时间停机后第一次启动时。后来改变逻辑使错误时延时100ms重新执行CreateFile,可以解决问题,一般每个故障循环在5次以内成功。 此外问题在500MHz主机2K操作系统下故障概率很小,而在2.4GHz主机xp系统下经常出问题。 //----------------------------------------------- 使用BusHound截获的通讯数据如下: //CreateFile不产生通信数据 //第一个DeviceIoControl(擦除)的数据: Bus Hound 5.00 capture. Complements of www.perisoft.net DeviceIoControl_IN_Erase Device - Device ID (followed by the endpoint for USB devices) (20) T-Square Bulk USB Device Phase - Phase Type CTL USB control transfer IRP NT I/O request packet STAK NT IRP stack location URB USB request block Data - Hex dump of the data transferred Descr - Description of the phase Cmd... - Position in the captured data Delta - Elapsed time from the previous phase to the current phase Time - Time the phase occurred in hour:minute:second.millisec form Device Phase Data Description ------ ----- -------------------------------------------------- ---------------- 20.0 CTL c0 fd 00 00 00 c0 00 00 VENDOR 20 IRP 06 00 00 01 00 00 00 00 70 00 00 40 a8 bd 43 81 d0 25 8b 81 d0 25 8b 81 00 00 00 00 00 00 00 00 01 01 04 04 00 00 00 81 1c fc 85 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b8 fc 85 01 20 STAK 0f 00 00 e0 b0 6f 34 82 00 00 00 00 03 00 22 00 INTERNAL IOCTL 00 00 00 00 70 6b 8b 81 00 00 00 00 57 b6 9c f9 20 66 8b 81 20.0 URB 50 00 08 00 00 00 00 00 20 5e 5f 81 20 00 00 00 CONTROL TRANSFER 38 5e 5f 81 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff 0d f0 ad de 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //第二个DeviceIoControl(写命令)的数据: Bus Hound 5.00 capture. Complements of www.perisoft.net DeviceIoControl_IN_Write Device Phase Data Description ------ ----- -------------------------------------------------- ---------------- 20.0 CTL c0 fd 00 00 00 00 00 00 VENDOR 20 IRP 06 00 00 01 00 00 00 00 70 00 00 40 a8 bd 43 81 d0 25 8b 81 d0 25 8b 81 00 00 00 00 00 00 00 00 01 01 04 04 00 00 00 81 18 fc 85 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 24 fd 85 01 20 STAK 0f 00 00 e0 b0 6f 92 82 00 00 00 00 03 00 22 00 INTERNAL IOCTL 00 00 00 00 70 6b 8b 81 00 00 00 00 57 b6 9c f9 20 66 8b 81 20.0 URB 50 00 08 00 00 00 00 00 20 5e 5f 81 20 00 00 00 CONTROL TRANSFER 38 5e 5f 81 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff 0d f0 ad de 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //WriteFileEx的通信数据: Bus Hound 5.00 capture. Complements of www.perisoft.net WriteFileEx_IN_Write Device Phase Data Description ------ ----- -------------------------------------------------- ---------------- 20 IRP 06 00 00 01 10 34 44 81 00 0a 00 40 00 00 00 00 d0 25 8b 81 d0 25 8b 81 00 00 00 00 00 00 00 00 01 01 04 04 00 00 00 81 30 40 ac 00 00 00 00 00 4e 85 83 7c 7e 19 40 00 00 00 00 00 00 00 00 00 20 STAK 0f 00 00 e0 b8 4f 32 82 00 00 00 00 03 00 22 00 INTERNAL IOCTL 00 00 00 00 70 6b 8b 81 00 00 00 00 65 d2 9c f9 20 66 8b 81 20.1 LEN 00 10 00 00 4096 20.1 DO 02 3b f9 00 00 00 00 00 00 00 00 00 00 00 00 00 .;.............. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ e7 09 f6 08 df fa 80 46 e7 09 f2 08 df fa 80 3e .......F.......> 20.1 URB 48 00 09 00 00 00 00 00 20 5e 5f 81 20 00 00 00 BULK/INT XFER 84 e2 87 81 02 00 00 00 00 10 00 00 00 00 00 00 10 34 44 81 00 00 00 00 ff ff ff ff 0d f0 ad de 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //通信数据结束 希望知道问题的根本原因,恳请各位大侠不吝赐教。 [编辑 - 3/28/05 by daseny] |
|
|
沙发#
发布于:2005-03-28 16:01
硬件跟你的代码运行协调问题,并不能单靠延时来解决。
不明白为什么每次循环中都要打开一次EP0,可以重新组织代码。 |
|
|
板凳#
发布于:2005-03-29 11:45
先谢谢了 :)
这个更新程序还有些其它功能,我没有完全看过,估计是为了整合代码。我会仔细检查一下相关调用,改成打开一次尝试一下。 关于协调问题可否给个建议,如何从根本上解决这个问题? |
|
|
地板#
发布于:2005-03-29 11:49
对不起,我在给分的时候出现下边的错误,容后再试 :)
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /usr/home/ddv.com/forum/givepoint.php on line 103 Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /usr/home/ddv.com/forum/givepoint.php on line 109 |
|
|
地下室#
发布于:2005-03-29 15:45
把pipe00和pipe01改为pipe0和pipe1试试
|
|
5楼#
发布于:2005-03-30 09:03
我试了,一样不行啊 :)
请问duanjong兄,你的原理是什么啊? 我在NTDDK中的USB帮助中,看到明确的说明: Bulk I/O Operation: Opening the Device User-mode applications ask the operating system to generate a unique device instance name based on the GUID used by the driver in the IoRegisterDeviceInterface routine by calling a sequence of SetupDi functions. The user-mode application then appends the pipe name to the device instance name and passes this concatenated string to CreateFile. Pipe names have the form PIPExx, where xx is an ASCII representation of an integer from 0 to the number of pipes supported by the USB device, minus one. |
|
|
6楼#
发布于:2005-03-31 08:53
实在不好意思,给分还是有错误,我中间点了一下“给分”尝试了一下,结果分全跑到问题贴上去了 :P
|
|
|
7楼#
发布于:2005-03-31 08:57
呵呵,是我看错了,分谁也没给,可是加分的按钮没有了。我试着给贴在改分,还是没有 :(
|
|
|
8楼#
发布于:2005-04-04 12:46
尝试过了只打开一次管道,问题一样会出,不过效率高多了 :)
现在才发现,原来那种没有效率的方法是为了使程序更加稳定,可以应付各种意外。现在只大开一次,我需要在每次用到句柄的时候都作检测,或者加异常处理。 看到MS网站上关于XP对USB的改动,又两个,还没看太明白。 |
|
|