阅读:6177回复:15
请教:usb设备writefile可写,readfile不能正确读,why?
我们自己开发的一个USB的HID类设备,使用windows自带的驱动程序。但能写不能读,请教斑竹和各位大虾,可能原因?
|
|
沙发#
发布于:2002-01-25 08:03
描述一下具体的现象
|
|
|
板凳#
发布于:2002-01-25 09:31
发一份过来看看,我也在开发hid设备,切磋一下
mail:shorrow@sohu.com |
|
地板#
发布于:2002-04-17 13:51
我也正在做呃方面的工作,办咿
|
|
地下室#
发布于:2005-05-13 18:04
刚做了一个HID类型USB设备应用程序开发,你把你所遇到的问题
说清楚,才能帮你解决。。。 |
|
5楼#
发布于:2005-05-13 22:17
原因:
1、你的设备应该有OUTPUT报告 2、你的WRITEFILE第一个字节应有REPORT ID,如果你定义了的话。 3、用GetLastError查看你的最后错误 |
|
|
6楼#
发布于:2005-05-16 14:19
你的设备有中断通道吗?readfile和writefile用的通道不太相同。writefile可以控制传输也可中断传输,readfle只能中断。
|
|
7楼#
发布于:2008-03-25 17:38
我也有同样的问题,具体现象是:用writefile发送数据的时候HID设备可以正确接受,但是用readfile接受数据的时候,应用程序死在了readfile函数里面.用bus hound跟踪的时候writefile跟到的是set report指令(即21 09 00 .........)但是readfile什么也没有跟踪到.但是把死掉的应用程序关闭以后,bus hound跟踪urb可以得到read.
是不是readfile根本就不会发送USB控制指令,设备也不会响应readfile???? 是不是readfile只是读取主机usb buf里面的数据,只要设备在处理完writefile以后需要直接反送处理结果,然后调用readfile,才可以取得数据????? 我暂时用的取字符串的指令来读取的数据,那位大哥可以解决readfile的问题,告诉小弟一声,不胜感激 |
|
8楼#
发布于:2008-03-25 17:44
比较赞同jackadandy的说法
因为中断端点不需要主机传送指令,而是直接轮训的把数据返回给主机,这样使用主机usb buf里面总数有有效数据存在,这样的readfile可以读取到数据. |
|
9楼#
发布于:2008-04-04 11:23
那位老大有好办法????/
|
|
驱动牛犊
|
10楼#
发布于:2008-04-04 15:00
我感觉问题出在你的固件程序,readfile和writefile用法虽不一样,但是也不容易出问题
你定义一个静态数组在固件中,看看可以用readfile读出来么? 再有你多次调用writefile看数据是否有更新,也许你的writefile只是进行了一次传输,就进入错误截止了,因此再调用readfile肯定死机. 建议对writefile的部分重传,确保正确传输. 很大程度是固件程序问题 |
11楼#
发布于:2008-04-08 15:32
|
|
12楼#
发布于:2008-04-08 15:41
gcc3126283344179:
writefile写入的数据可以固件可以正确接受到,没有任何错误.但是readfile一直读不出数据.我想请教一下,使用writefile时我固件接受到的是一个标准的HID类指令set report.那么readfile在微软的标准HID驱动里面发到我固件里面的HID类指令应该是什么?????还是readfile根本就不会向我固件发送指令,仅仅是读取主机分配的USB内存的数据???? gcc3126283344179大哥能给解答一下吗???? |
|
驱动牛犊
|
13楼#
发布于:2008-04-10 10:10
我估计是的
你用你的writefile是积活你的设备传输程序,如果有数据就传,没有就返回 这样你PC缓冲区就会有相关的数据 具体这样 我的固件接受函数: void USB_ep2_rx(void) { /* EP2 receives the messages in raw format (size of cmd+data, cmd, data0, data1, ...) */ unsigned char * ptr=&UE2D0; usb_ep2_dcntR=8; //if (usb_ep2_dcntR==0) { /* if the routine is called with no data to be received, it must be beginning of a message */ UCR2_TX2E=0; /* disable EP2 transmitter */ //usb_ep2_dcntR=UE2D0; usb_dptr=command_buffer; // ptr = &UE2D1; /* skip copying the size */ // } while ((ptr<((&UE2D0)+8))&&(usb_ep2_dcntR)) { *(usb_dptr++) = *(ptr++); /* copy data */ usb_ep2_dcntR--; /* decrement count */ } if (usb_ep2_dcntR==0) { /* command reception complete */ usb_ep2_dcntR=command_exec(); usb_ep2_dcntT=8; usb_dptr=command_buffer; USB_ep2_tx(); /* start transmitting the data */注意这里啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1 } } 我的固件发送函数: void USB_ep2_tx(void) { UCR2_TX2E=0; /* disable EP2 transmitter */ UIR2_TXD2FR = 1; /* clear the interrupt flag to make sure the packet transmits */ if (usb_ep2_dcntT==0) return ; /* no data to transmit - return without enabling the transmitter */ /* transmit data from the buffer (must be in Zero Page) */ UE2D0 = *(usb_dptr++); /* copy all 8 bytes, packet might be shorter than 8 bytes */ UE2D1 = *(usb_dptr++); UE2D2 = *(usb_dptr++); UE2D3 = *(usb_dptr++); UE2D4 = *(usb_dptr++); UE2D5 = *(usb_dptr++); UE2D6 = *(usb_dptr++); UE2D7 = *(usb_dptr++); if (usb_ep2_dcntT>8) { UCR2 = ((UCR2^UCR2_T2SEQ_MASK)&UCR2_T2SEQ_MASK) | UCR2_TX2E_MASK | UCR2_RX2E_MASK + 8; /* enable transmission on EP2, toggle DATA0/1, length 8 (more data in buffer) */ usb_ep2_dcntT-=8; } else { UCR2 = ((UCR2^UCR2_T2SEQ_MASK)&UCR2_T2SEQ_MASK) | UCR2_TX2E_MASK | UCR2_RX2E_MASK + usb_ep2_dcntT; /* enable transmission on EP2, toggle DATA0/1, length according to count */ usb_ep2_dcntT = 0; /* no more data to transmit */ } } |
14楼#
发布于:2008-04-25 15:05
gcc3126283344179:
你上层发送readfile的时候可以激活你的设备的发送函数吗???, |
|
15楼#
发布于:2010-06-05 19:28
我也碰到类似的问题,能写不能读,读时候出现重叠操作的问题,希望哪位大哥能解决啊。
|
|