muyunke
驱动牛犊
驱动牛犊
  • 注册日期2002-01-08
  • 最后登录2002-05-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5899回复:15

请教:usb设备writefile可写,readfile不能正确读,why?

楼主#
更多 发布于:2002-01-24 21:09
我们自己开发的一个USB的HID类设备,使用windows自带的驱动程序。但能写不能读,请教斑竹和各位大虾,可能原因?
KungFu
驱动大牛
驱动大牛
  • 注册日期2001-09-27
  • 最后登录2008-04-08
  • 粉丝0
  • 关注0
  • 积分221分
  • 威望24点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-01-25 08:03
描述一下具体的现象
我不写驱动好多年
shorrow
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2003-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-01-25 09:31
发一份过来看看,我也在开发hid设备,切磋一下

mail:shorrow@sohu.com
lvxx
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2002-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-17 13:51
我也正在做呃方面的工作,办咿
junki
驱动牛犊
驱动牛犊
  • 注册日期2004-09-02
  • 最后登录2007-11-30
  • 粉丝0
  • 关注0
  • 积分124分
  • 威望13点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-13 18:04
刚做了一个HID类型USB设备应用程序开发,你把你所遇到的问题
说清楚,才能帮你解决。。。
lejianz
驱动中牛
驱动中牛
  • 注册日期2003-03-05
  • 最后登录2023-11-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望145点
  • 贡献值0点
  • 好评度116点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-05-13 22:17
原因:
1、你的设备应该有OUTPUT报告
2、你的WRITEFILE第一个字节应有REPORT ID,如果你定义了的话。
3、用GetLastError查看你的最后错误
一起交流,共同提高!
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-16 14:19
你的设备有中断通道吗?readfile和writefile用的通道不太相同。writefile可以控制传输也可中断传输,readfle只能中断。
sanhecunyue
驱动牛犊
驱动牛犊
  • 注册日期2006-08-11
  • 最后登录2013-04-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
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的问题,告诉小弟一声,不胜感激
sanhecunyue
驱动牛犊
驱动牛犊
  • 注册日期2006-08-11
  • 最后登录2013-04-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-03-25 17:44
比较赞同jackadandy的说法
因为中断端点不需要主机传送指令,而是直接轮训的把数据返回给主机,这样使用主机usb buf里面总数有有效数据存在,这样的readfile可以读取到数据.
sanhecunyue
驱动牛犊
驱动牛犊
  • 注册日期2006-08-11
  • 最后登录2013-04-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-04-04 11:23
那位老大有好办法????/
gcc312628334417
驱动牛犊
驱动牛犊
  • 注册日期2008-03-16
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分630分
  • 威望65点
  • 贡献值1点
  • 好评度64点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-04-04 15:00
我感觉问题出在你的固件程序,readfile和writefile用法虽不一样,但是也不容易出问题
你定义一个静态数组在固件中,看看可以用readfile读出来么?
再有你多次调用writefile看数据是否有更新,也许你的writefile只是进行了一次传输,就进入错误截止了,因此再调用readfile肯定死机.
建议对writefile的部分重传,确保正确传输.
很大程度是固件程序问题
sanhecunyue
驱动牛犊
驱动牛犊
  • 注册日期2006-08-11
  • 最后登录2013-04-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-04-08 15:32
sanhecunyue
驱动牛犊
驱动牛犊
  • 注册日期2006-08-11
  • 最后登录2013-04-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-04-08 15:41
gcc3126283344179:
  writefile写入的数据可以固件可以正确接受到,没有任何错误.但是readfile一直读不出数据.我想请教一下,使用writefile时我固件接受到的是一个标准的HID类指令set report.那么readfile在微软的标准HID驱动里面发到我固件里面的HID类指令应该是什么?????还是readfile根本就不会向我固件发送指令,仅仅是读取主机分配的USB内存的数据????
gcc3126283344179大哥能给解答一下吗????
gcc312628334417
驱动牛犊
驱动牛犊
  • 注册日期2008-03-16
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分630分
  • 威望65点
  • 贡献值1点
  • 好评度64点
  • 原创分0分
  • 专家分0分
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 */
  }
}
sanhecunyue
驱动牛犊
驱动牛犊
  • 注册日期2006-08-11
  • 最后登录2013-04-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2008-04-25 15:05
gcc3126283344179:
  你上层发送readfile的时候可以激活你的设备的发送函数吗???,
mengbm
驱动牛犊
驱动牛犊
  • 注册日期2010-05-31
  • 最后登录2010-06-05
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2010-06-05 19:28
我也碰到类似的问题,能写不能读,读时候出现重叠操作的问题,希望哪位大哥能解决啊。
游客

返回顶部