USB论坛-百合电子工作室USB专题站

 找回密码
 我要注册
搜索
热搜: USB学习板
查看: 4658|回复: 7
打印 上一主题 下一主题

USB HID主机程序不能读数据

[复制链接]

1

主题

0

好友

13

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2012-6-8 18:46:49 |只看该作者 |倒序浏览
大侠们。我用开源项目里的USB HID通信例子,做好了,但是不能读数据,这是为什么?我输入123它给我的是“烫烫烫烫”莫非是类型不匹配?谁知道啊?就是开源项目里面源代码。
回复

使用道具 举报

6

主题

0

好友

1158

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2012-6-8 19:47:35 |只看该作者
你应该讲清楚是哪一节,哪个例子,必要时还要贴出源代码,把问题讲清楚点,这样才好帮你呀
回复

使用道具 举报

1

主题

0

好友

13

积分

新手上路

Rank: 1

板凳
发表于 2012-6-9 08:50:49 |只看该作者
是开源项目EASY USB 51 Programer:自定义USB HID设备—PC主机应用程序开发 这一节(http://usb.baiheee.com/usb_proje ... _hid_user_comm.html

void CEasyUSB51ProgramerTest1Dlg::OnBtnWrite()      
{     
    unsigned char ucTxBuffer[64];   //发送缓冲     
    unsigned char ucRxBuffer[64];   //接收缓冲     
   
    UpdateData(TRUE);     
   
    //判断发送框中内容是否超过64字节     
    if(m_strTx.GetLength()>64)     
    {     
        AfxMessageBox("发送字节数不能超过64个字节");     
    }     
   
    //准备发送缓冲区中的内容     
    for(int i=0; i<64 ; i++)     
    {     
        if(i <= (m_strTx.GetLength()-1) )     
            ucTxBuffer   = m_strTx.GetAt(i);     
        else   
            ucTxBuffer   = 0;     
    }     
   
    //写操作     
    m_MyHidDevice.WriteHid(ucTxBuffer,64);     
    //读操作     
    m_MyHidDevice.ReadHid(ucRxBuffer,64);     
   
    m_strRx     = ucRxBuffer;     
    UpdateData(FALSE);     
}   

这部分,我是按照你的做的,但是最后ReadHid读不出数据啊。读出的情况就是我在贴子上朔的情况?这是怎么回事呢?
回复

使用道具 举报

6

主题

0

好友

1158

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2012-6-9 09:13:58 |只看该作者
这是由于ReadHid没有读到数据所致辞。可以用BusHound监视下位机发过来的数据正常与否。还有,固件里报告描述符定义的输入报告有几种?如果有一种以上,是需要区别报告ID的,而且还要注意每种输入报告的长度。
回复

使用道具 举报

2

主题

0

好友

18

积分

新手上路

Rank: 1

5#
发表于 2012-6-10 10:17:11 |只看该作者
很可能是因为USB本身是用的两个通道实现读和写的,还有一个通道用于控制命令处理,有一些设备就必需使用不同的打开方式,打开三个句柄,一个用来读,一个用来写,一个用来发送控制信息,这个和你的设备以及操作系统都有关系,所以建议不管如何,都按下面的方式来打开,这个网站提供的程序只打开一个句柄,在有些时候是会出问题的。
打开控制端口应该这样打开:

hDeviceHandle = CreateFile( detailData->DevicePath,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
0,
NULL);

打开写入端口应该这样:

hWriteHandle = CreateFile(detailData->DevicePath, GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
0,
NULL);

打开读取端口应该这样:

hReadHandle = CreateFile(detailData->DevicePath, GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
0,
NULL);

然后你做不同操作,用不同的句柄就行了。

注意:键盘和鼠标只能用这种方式打开控制端口,并且应用程序只能打开控制端口,获取一些信息,而不能写入控制信息,并且不能以读写方式打开。
回复

使用道具 举报

6

主题

0

好友

1158

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2012-6-10 11:20:43 |只看该作者
楼上saliven说得非常有道理,建议写句柄和读句柄分开,那么开源项目里提供的CHid类应该定义两个HANDLE类型成员变量,一个保存用于写HID的句柄,另一个用于读HID的句柄。建议楼主试试
回复

使用道具 举报

1

主题

0

好友

13

积分

新手上路

Rank: 1

7#
发表于 2012-6-11 11:24:19 |只看该作者
我按saliven所说的把读和写的句柄分开了,但还是显示“烫烫烫烫”,不过单步bebug时,发现运行到m_strRx = ucRxBuffer里面都没读出数时都没读出数据,但是运行到后面函数的大括号时,ucRxBuffer里却有数了,但由于这里没有再执行赋值语句将ucRxBuffer赋给m_strRx,所以显示还是不对。
回复

使用道具 举报

6

主题

0

好友

1158

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2012-6-11 13:29:49 |只看该作者
mark 发表于 2012-6-11 11:24
我按saliven所说的把读和写的句柄分开了,但还是显示“烫烫烫烫”,不过单步bebug时,发现运行到m_strRx =  ...

这是因为我写的那天个CHid类是异步IO操作的,执行完ReadFile后立即返回,所以这时读缓冲区里可能还没有收到数据,等过一会儿才有数据的。您可以在ReadHid里加上等待缓冲区中数据全部到达才返回的功能(但需要加上超时,用WaitEvent方法)。要不就直接将异步IO操作改成同步IO操作,不过这样会阻塞线程,所以改成同步后,读操作最好放到另外一个线程中。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 我要注册

USB开发网 (渝ICP备09006681号-4)

GMT+8, 2024-4-20 09:58 , Processed in 0.067194 second(s), 24 queries .

百合电子工作室版权所有
回顶部