为什么自定义的stm32 usb hidd不能主动上传数据

做USB-HID设备数据传输时,qt调用win32 API,出错_qt吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:36,116贴子:
做USB-HID设备数据传输时,qt调用win32 API,出错收藏
//第一步:获取deviceIDGUID deviceId;HidD_GetHidGuid(&deviceId);//报错D:\personal\desk\thinkpad\qtprogram\hello\widget.cpp:-1: error: undefined reference to `_imp__HidD_GetHidGuid@4*第一步获取设备号时就出错Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget){
ui-&setupUi(this);
GUID deviceId;
HidD_GetHidGuid(&deviceId);//报错
handle = SetupDiGetClassDevs(&deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); //Get only HID devices//报错}只是在空白项目中添加了几句话,已添加window.h头文件,但没有修改.pro中的文件求大神给看一下
qt50ulbq6}美国邦纳BANNER原装正品新品 价格优惠.各型号产品均有特价!公司经营美国邦纳BANNER,德国西克施克SICK.
我想知道还需要添加什么?头文件还是库文件?
pro文件中加入 libs+=-l〔库名〕~~库名自己网上找下是哪个动态库…
厂家供货 价格优势 质量保证 真诚的期待您的来电!
嗯嗯,需要放到工程文件下吗,还是QT中自带的,QT能包含windows.h#include &windows.h&#include &hidsdi.h&#include &Setupapi.h&#include &QUuid&对这些头文件不报错,那么还要添加库吗?HidD_GetHidGuid()函数是包含在#include &hidsdi.h&头文件下的,编写时不报错,但编译时报错!
根据文档,这个函数包含在hid.lib库中,但我已经包含了hidsdi.h头文件,是否还需要添加库,这只是刚进行USB设备识别就出现了这么多问题,我感觉.pro文件有问题,大神帮忙看一下!@吾儿梁龙庆
你需要添加其对应的库文件
登录百度帐号推荐应用请教关于USB HID数据传输的问题 - 嵌入式系统编程 -
电子工程世界-论坛
后使用快捷导航没有帐号?
请完成以下验证码
查看: 3547|回复: 10
请教关于USB HID数据传输的问题
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
我现在在用的ARM的USB模块于PC通讯,我想请教各位高手,如果ARM想发送数据给PC,能主动发送一个中断之类的给PC,让PC接受吗?还是只能PC先发命令呢?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
这个我也很想了解,帮顶一下!
在线时间3 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
pc不是都抽象成了线程了吗
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
发数据的话用轮询吧
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
引用 3 楼 guoyu_bo 的回复:
发数据的话用轮询吧
也就是说还是要PC先说话?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
应该是先PC触发ARM中断
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
LPC哪款,device还是host?
如果是device,ARM到PC的数据传输只有在PC每10ms发送的IN令牌包之后进行。
device无法主动发起通信。
如果是host或者OTG就可以。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
引用楼主 iamrik 的回复:
我现在在用LPC的ARM的USB模块于PC通讯,我想请教各位高手,如果ARM想发送数据给PC,能主动发送一个中断之类的给PC,让PC接受吗?还是只能PC先发命令呢?lz可以看一下USB协议 设备总是被动的
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
楼主用的是NXP的那款ARM?
LPC214X还是LPC24XX
如果需要与PC连接,一般你的ARM对应的开发板或者设备,都只能被PC认成device,不可能被认为HOST。
所以与PC连接,对应的ARM设备,都需要等待PC对应的指令。
如果你的ARM设备作为HOST,也一般只会接U盘 或者USB鼠标等等,此时由你的ARM设备发送相关的指令。
但此时不可能PC。
因为PC一般都只会做HOST。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
搞点分苏哦
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
引用 8 楼 kyzf 的回复:
楼主用的是NXP的那款ARM?
LPC214X还是LPC24XX
如果需要与PC连接,一般你的ARM对应的开发板或者设备,都只能被PC认成device,不可能被认为HOST。
所以与PC连接,对应的ARM设备,都需要等待PC对应的指令。
如果你的ARM设备作为HOST,也一般只会接U盘 或者USB鼠标等等,此时由你的ARM设备发送相关的指令。
但此时不可能PC。
因为PC一般都……
我用的是LPC2368,做从机,那看来只有PC先说话罗
EEWORLD 官方微信
EE福利 唾手可得
Powered by12:58 提问
usb hid 报告字节数 变长传输
想请教一个关于hid通信过程中报告传输数据的字节数的问题。
1.下位机规定报告字节数最大为64字节
2.通信协议是不定长的,每条命令返回值长度不同,下位机不会自动补全64字节。
** Q1、我在编写上位机过程中使用windows的 ReadFile 读取的时候,发现下位机返回数据不够64字节的时候ReadFile没有数据,只有够了64字节才会读到数据。而我想实现的是能够读取下位机返回的变长数据,因为下位机没有补全64字节,我可以怎么尝试?**
我自己也在网上查找了一些资料,了解到可能是ReadFile读取数据格式是{报告id+报告长度}的整数倍,下位机返回数据不够64字节就不放在ReadFile的缓冲区中?我使用bus hound监测,发现我的设备有两个选项,1.USB人体学输入设备 2.HID-compliant-device。在使用程序发送数据时,1能够监测到任何发送数据以及返回数据,而2只能够监测到发送数据,以及返回字节数满64字节的返回数据,不够64的就没有显示。
Q2、想请问下 1.USB人体学输入设备 2.HID-compliant-device这两个东西直接的关系及区别?
希望了解的人帮忙解答下,万分感谢!
按赞数排序
解决了没有。。。同问
解决了没有。。。同问
其他相关推荐Windows与自定义USB HID设备通信说明.
时间: 19:31:58
&&&& 阅读:533
&&&& 评论:
&&&& 收藏:0
标签:1&.&&&所使用的典型&Windows API
CreateFile
以下函数是&DDK&的内容:
HidD_SetFeature
HidD_GetFeature
HidD_SetOutputReport
HidD_GetInputReport
其中,&CreateFile&用于打开设备;&ReadFile&、&HidD_GetFeature&、&HidD_GetInputReport&用于设备到主机方向的数据通信;&WriteFile&、&HidD_SetFeature&、&HidD_SetOutputReport&用于主机到设备方向的数据通信。鉴于实际应用,后文主要讨论&CreateFile&,&WriteFile&,&ReadFile&,HidD_SetFeature&四个函数,明白了这四个函数,其它的可以类推之。
2&.&&&几个常见错误
&&&&&&&当使用以上&API&时,如果操作失败,调用&GetLastError()&会得到以下常见错误:
&&&&&& 6&:&&&&&&&&&&句柄无效
&&&&&& 23&:&&&&&&&&数据错误(循环冗余码检查)
&&&&&& 87&:&&&&&&&&参数错误
&&&&&& 1784&:&&&&&用户提供的&buffer&无效
&&&&&&&后文将会详细说明这些错误情况。
3.&&&&&&&&&主机端设备枚举程序流程
4.&&&&&&&&&函数使用说明
CreateFile(devDetail-&DevicePath,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&设备路径
&&&&&&&&&&&&&& GENERIC_READ | GENERIC_WRITE,&&&&&&&&&&&&&&&&&&& //&访问方式
&&&&&&&&&&&&&& FILE_SHARE_READ | FILE_SHARE_WRITE,&&&&&&&& //&共享模式
&&&&&&&&&&&&&& NULL,
&&&&&&&&&&&&&& OPEN_EXISTING,&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&文件不存在时,返回失败
&&&&&&&&&&&&&& FILE_FLAG_OVERLAPPED,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&以重叠(异步)模式打开
&&&&&&&&&&&&&& NULL);
在这里,&CreateFile&用于打开&HID&设备,其中设备路径通过函数SetupDiGetInterfaceDeviceDetail&取得。&CreateFile&有以下几点需要注意:
-&&&&&访问方式:&如果是系统独占设备,例如鼠标、键盘等等,应将此参数设置为&0&,否则后续函数操作将失败(譬如&HidD_GetAttributes&);也就是说,不能对独占设备进行除了查询以外的任何操作,所以能够使用的函数也是很有限的,下文的一些函数并不一定适合这些设备。在此顺便列出&MSDN&上关于此参数的说明:
If this parameter is zero, the application can query file and device attributes without accessing the device. This is useful if an application wants to determine the size of a floppy disk drive and the formats it supports without requiring a floppy in the drive. It can also be used to test for the file‘s or directory‘s existence without opening it for read or write access&。
-&&&&&&&&&&重叠(异步)模式:此参数并不会在此处表现出明显的意义,它主要是对后续的&WriteFile&,ReadFile&有影响。如果这里设置为重叠(异步)模式,那么在使用&WriteFile&,&ReadFile&时也应该使用重叠(异步)模式,反之亦然。这首先要求&WriteFile&,&ReadFile&的最后一个参数不能为空(NULL&)。否则,便会返回&87&(参数错误)错误号。当然,&87&号错误并不代表就是此参数不正确,更多的信息将在具体讲述这两个函数时指出。此参数为&0&时,代表同步模式,即&WriteFile&,&ReadFile操作会在数据处理完成之后才返回,否则阻塞在函数内部。
ReadFile(hDev,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&设备句柄,即&CreateFile&的返回值
&&&&&&&&&&&&& recvBuffer,&&&&&&&&&&&&&&&&&&&&&&&&& //&用于接收数据的&buffer
&&&&&&&&&&&&& IN_REPORT_LEN,&&&&&&&&&&&&& //&要读取数据的长度
&&&&&&&&&&&&& &recvBytes,&&&&&&&&&&&&&&&&&&&&&&&& //&实际收到的数据的字节数
&&&&&&&&&&&&& &ol);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&异步模式
在这里,&ReadFile&用于读取&HID&设备通过中断&IN&传输发来的输入报告&。有以下几点要注意:
1&、&ReadFile&的调用不会引起设备的任何反应,即&HID&设备与主机之间的中断&IN&传输不与ReadFile&打交道。实际上主机会在最大间隔时间(由设备的端点描述符来指定)内轮询设备,发出中断&IN&传输的请求。&读取&即意味着从某个&buffer&里面取回数据,实际上这个&buffer&就是&HID&设备驱动中的buffer&。这个&buffer&的大小可以通过&HidD_SetNumInputBuffers&来改变。在&XP&上缺省值是&32(个报告)。
2&、读取的数据对象是输入报告,也即通过中断输入管道传入的数据。所以,如果设备不支持中断&IN&传输,那么是无法使用此函数来得到预期结果的。实际上这种情况不可能在&HID&中出现,因为协议指明了至少要有一个中断&IN&端点。
3&、&IN_REPORT_LEN&代表要读取的数据的长度(实际的数据正文&+&一个&byte&的报告&ID&),这里是一个常数,主要是因为设备固件的信息我是完全知道的,当然知道要读取多少数据(也就是报告的长度);不过也可以通过另外的函数(&HidD_GetPreparsedData&)来事先取得报告的长度,这里不做详细讨论。因为很难想象在不了解固件信息的情况下来做自定义设备的&HID&通信,在实际应用中一般来说就是固件与&PC&程序匹配着来开发。此参数如果设置过大,不会有实质性的错误,在&recvBytes&参数中会输出实际读到的长度;如果设置过小,即小于报告的长度,会返回&1784&号错误(用户提供的&buffer&无效)。
4&、关于异步模式。前面已经提过,此参数的设置必须与&CreateFile&时的设置相对应,否则会返回&87号错误(参数错误)。如果不需要异步模式,此参数需置为&NULL&。在这种情况下,&ReadFile&会一直等待直到数据读取成功,所以会阻塞住程序的当前过程。
&&&&&&&WriteFile(hDev,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&设备句柄,即&CreateFile&的返回值
&&&&&&&&&&&&&&&&&&&& reportBuf,&&&&&&&&&&&&&&&&&&&&&&&&&& //&存有待发送数据的&buffer
&&&&&&&&&&&&&&&&&&&& OUT_REPORT_LEN,&&&&&&&&&& //&待发送数据的长度
&&&&&&&&&&&&&&&&&&&& &sendBytes,&&&&&&&&&&&&&&&&&&&&&&& //&实际收到的数据的字节数
&&&&&&&&&&&&&&&&&&&& &ol);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&异步模式
&&&&&&&在这里,&WriteFile&用于传输一个输出报告&给&HID&设备。有以下几点要注意:
1、&&与&ReadFile&不同,&WriteFile&函数被调用后,虽然也是经过驱动程序,但是最终会反映到设备中。也就是说,调用&WriteFile&后,设备会接收到输出报告的请求。如果设备使用了中断&OUT&传输,则WriteFile&会通过中断&OUT&管道来进行传输;否则会使用&SetReport&请求通过控制管道来传输。
2、&&OUT_REPORT_LEN&代表要写入的数据长度(实际的数据正文&+&一个&byte&的报告&ID&)。如果大于实际报告的长度,则使用实际报告长度;如果小于实际报告长度,会返回&1784&号错误(用户提供的&buffer&无效)。
3、&&reportBuf&[0]&必须存有待发送报告的&ID&,并且此报告&ID&指示的必须是输出报告,否则会返回&87号错误(参数错误)。这种情况可能容易被程序员忽略,结果不知错误号所反映的是什么,网上也经常有类似疑问的帖子。顺便指出,输入报告、输入报告、特征报告这些报告类型,是反映在&HID&设备的报告描述符中。后文将做举例讨论。
4、&&关于异步模式。前面已经提过,此参数的设置必须与&CreateFile&时的设置相对应,否则会返回&87&号错误(参数错误)。如果不需要异步模式,此参数需置为&NULL&。在这种情况下,&WriteFile&会一直等待直到数据读取成功,所以会阻塞住程序的当前过程。
HidD_SetFeature(hDev,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&设备句柄,即CreateFile&的返回值
&&&&&&&&&&&&&&&&&&&& reportBuf,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&存有待发送数据的&buffer
&&&&&&&&&&&&&&&&&&&& FEATURE_REPORT_LEN);&&&&&&& //buffer&的长度
HidD_SetOutputReport(hDev,&&&&&&&&&&&&&&&&&&&&&&&&&&& //&设备句柄,即&CreateFile的返回值
&&&&&&&&&&&&&&&&&&&& reportBuf,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&存有待发送数据的&buffer
&&&&&&&&&&&&&&&&&&&& OUT_REPORT_LEN);&&&&&&&&&&&&&&& //buffer&的长度
HidD_SetFeature&发送一个特征报告&给设备,&HidD_ SetOutputReport&发送一个输出报告&给设备。注意以下几点:
1、&&跟&WriteFile&类似,必须在&reportBuf&[0]&中指明要发送的报告的&ID&,并且和各自适合的类型相对应。也就是说,&HidD_SetFeature&只能发送特征报告,因此报告&ID&必须是特征报告的&ID&;HidD_SetOutputReport&只能发送输出报告,因此报告&ID&只能是输出报告的&ID&。
2、&&这两个函数最常返回的错误代码是&23&(数据错误)。包括但不仅限于以下情况:
-&报告&ID&与固件描述的不符。
-&传入的&buffer&长度少于固件描述的报告的长度。
据有关资料反映(非官方文档),只要是驱动程序对请求无反应,都会产生此错误。
5.&&&&&&&&&常见错误汇总
- HID ReadFile
& - Error Code 6 (handle is invalid)
&&&&传入的句柄无效
& - Error Code 87 (&参数错误&)
&&&&很可能是&createfile&时声明了异步方式,但是读取时按同步读取。
& - Error Code 1784 (&用户提供的&buffer&无效&):
&&&&传参时传入的&读取&buffer&长度&与实际的报告长度不符。
- HID WriteFile
& - Error Code 6 (handle is invalid)
&&&&传入的句柄无效
& - Error Code 87&(参数错误)
&&& - CreateFile&时声明的同步&/&异步方式与实际调用&WriteFile&时传入的不同。
&&& -&报告&ID&与固件中定义的不一致(&buffer&的首字节是报告&ID&)
& - Error Code 1784 (&用户提供的&buffer&无效&)
&&&&传参时传入的&写入&buffer&长度&与实际的报告长度不符。
- HidD_SetFeature
- HidD_SetOutputReport
& - Error Code 1 (incorrect function)
&&&&不支持此函数,很可能是设备的报告描述符中未定义这样的报告类型(输入、输出、特征)
& - Error Code 6 (handle is invalid)
&&&&传入的句柄无效
& - Error Code 23&(数据错误(循环冗余码检查))
&&& -&报告&ID&与固件中定义的不相符(&buffer&的首字节是报告&ID&)
&&& -&传入的&buffer&长度少于固件定义的报告长度(报告正文&+1byte, 1byte&为报告&ID&)
&&& -&据相关资料反映(非官方文档),只要是驱动程序不接受此请求(对请求无反应),都会产生此错误
6.&&&&&&&&&报告描述符及数据通信程序示例
报告描述符(由于是汇编代码,所以不必留意其语法,仅需注意表中的每个数据都占&1&个字节):
_ReportDescriptor:&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&报告描述符
&&&&&& .dw 0x06,& 0x00, 0xff& &&&&&&&&&&&& //&用法页
&&& .dw 0x09,& 0x01&&&& &&&&&&&&&&&&&&& //&用法&(&供应商用法&1)
&&& .dw 0xa1,& 0x01&&&& &&&&&&&&&&&&&&&& //&集合开始
&&& .dw 0x85,& 0x01&&&&&&&&&&&&&&&&& &&&&&& //&报告&ID(1)
&&& .dw 0x09,& 0x01&&&&&&&&& &&&&&&& //&用法&(&供应商用法&1)&&
&&& .dw 0x15,& 0x00&&&&&&&&&& &&&&& //&逻辑最小值&(0)
&&& .dw 0x26,& 0xff, 0x0&&&&&& &&&&&&&&&&&&& //&逻辑最大值&(255)
&&& .dw 0x75,& 0x08&&&&&&&&&&&& & //&报告大小&(8)
&&& .dw 0x95,& 0x07 &&&&&&&&&&&&&&&&&&&&&& //&报告计数&(7)
&&& .dw 0x81,& 0x06&&&&&&&&&&&&& & //&输入&(数据,变量,相对值)
&&& .dw 0x09,& 0x01&&&& &&&&&&&&&&&&&&& //&用法&(&供应商用法&1) &
&&& .dw 0x85,& 0x03&&&&&&&&&&&&&&&&&&&&&&&& //&报告&ID&(&3&)
&&& .dw 0xb1, & 0x06&&&&&&&&&&&&&&&&&&&&&&&& //&特征&(数据,变量,相对值)
&&&&&& .dw 0x09,& 0x01&&&& &&&&&&&&&&&&&& //&用法&(&供应商用法&1)
&&& .dw 0x85,& 0x02&&&&&&&&&&&&&&&&&&&&&&&& //&报告&ID&(&2&)
&&& .dw 0xb1,& 0x06&&&&&&&&&&&&&&&&&&&&&&&& //&特征&(数据,变量,相对值)
& && .dw 0x09,& 0x01&&&& &&&&&&&&&&&&&&& //&用法&(&供应商用法&1) &
&&& .dw 0x85,& 0x04&&&&&&&&&&&&&&&&&&&&&&&& //&报告&ID&(&4&)
&&& .dw 0x91, & 0x06&&&&&&&&&&&&&&&&&&&&&&&& //&输出&(数据,变量,相对值)
&&& .dw&& 0xc0&&&&&&&&&&&&&&&&&&& //&结合结束
_ReportDescriptor_End:
这个报告描述符,定义了&4&个不同的报告:输入报告&1&,特征报告&2&,特征报告&3&,输出报告&4&(数字代表其报告&ID&)。为了简化,每个报告都是&7&个字节(加上报告&ID&就是&8&个字节)。下面用一个简单的示例来描述&PC&端与&USB HID&设备进行通信的一般方法。
#define&&&&&USB_VID&&&&&&&0xFC0&&&
#define&&&&&USB_PID&&&&&&&0x420&&&
HANDLE&OpenMyHIDDevice(int&overlapped);&&&
void&HIDSampleFunc()&&&
&&&&HANDLE&&&&&&&hD&&&
&&&&BYTE&&&&&&&&&recvDataBuf[8];&&&
&&&&BYTE&&&&&&&&&reportBuf[8];&&&
&&&&DWORD&&&&&&&&&&&
&&&&hDev&=&OpenMyHIDDevice(0);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&打开设备,不使用重叠(异步)方式&;&&&
&&&&if&(hDev&==&INVALID_HANDLE_VALUE)&&&
&&&&&&&&&&&
&&&&reportBuf[0]&=&4;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&输出报告的报告&ID&是&4&&&
&&&&memset(reportBuf,&0,&8);&&&
&&&&reportBuf[1]&=&1;&&&
&&&&if&(!WriteFile(hDev,&reportBuf,&8,&&bytes,&NULL))&&&&&&&&&//&写入数据到设备&&&
&&&&&&&&&&&&
&&&&ReadFile(hDev,&recvDatatBuf,&8,&&bytes,&NULL);&&&&&&&&&&&&//&读取设备发给主机的数据&&&
HANDLE&OpenMyHIDDevice(int&overlapped)&&&
&&&&HANDLE&hidH&&&
&&&&GUID&hidG&&&
&&&&HidD_GetHidGuid(&hidGuid);&&&
&&&&HDEVINFO&hDevInfo&=&SetupDiGetClassDevs(&hidGuid,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(DIGCF_PRESENT&|&DIGCF_DEVICEINTERFACE));&&&
&&&&if&(hDevInfo&==&INVALID_HANDLE_VALUE)&&&
&&&&&&&&return&INVALID_HANDLE_VALUE;&&&
&&&&SP_DEVICE_INTERFACE_DATA&devInfoD&&&
&&&&devInfoData.cbSize&=&sizeof&(SP_DEVICE_INTERFACE_DATA);&&&
&&&&int&deviceNo&=&0;&&&
&&&&SetLastError(NO_ERROR);&&&
&&&&while&(GetLastError()&!=&ERROR_NO_MORE_ITEMS)&&&
&&&&&&&&if&(SetupDiEnumInterfaceDevice&(hDevInfo,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&hidGuid,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&deviceNo,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&devInfoData))&&&
&&&&&&&&{&&&
&&&&&&&&&&&&ULONG&&requiredLength&=&0;&&&
&&&&&&&&&&&&SetupDiGetInterfaceDeviceDetail(hDevInfo,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&devInfoData,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&requiredLength,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL);&&
&&&&&&&&&&&&PSP_INTERFACE_DEVICE_DETAIL_DATA&devDetail&=&(SP_INTERFACE_DEVICE_DETAIL_DATA*)&malloc&(requiredLength);&&&
&&&&&&&&&&&&devDetail-&cbSize&=&sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);&&&
&&&&&&&&&&&&if(!SetupDiGetInterfaceDeviceDetail(hDevInfo,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&devInfoData,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&devDetail,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&requiredLength,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL))&&&
&&&&&&&&&&&&{&&&
&&&&&&&&&&&&&&&&free(devDetail);&&&
&&&&&&&&&&&&&&&&SetupDiDestroyDeviceInfoList(hDevInfo);&&&
&&&&&&&&&&&&&&&&return&INVALID_HANDLE_VALUE;&&&
&&&&&&&&&&&&}&&&
&&&&&&&&&&&&if&(overlapped)&&&
&&&&&&&&&&&&{&&&
&&&&&&&&&&&&&&&&hidHandle&=&CreateFile(devDetail-&DevicePath,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&GENERIC_READ&|&GENERIC_WRITE,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FILE_SHARE_READ&|&FILE_SHARE_WRITE,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&OPEN_EXISTING,&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FILE_FLAG_OVERLAPPED,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL);&&&
&&&&&&&&&&&&}&&&
&&&&&&&&&&&&else&&&
&&&&&&&&&&&&{&&&
&&&&&&&&&&&&&&&&hidHandle&=&CreateFile(devDetail-&DevicePath,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&GENERIC_READ&|&GENERIC_WRITE,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FILE_SHARE_READ&|&FILE_SHARE_WRITE,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&OPEN_EXISTING,&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL);&&&
&&&&&&&&&&&&}&&&
&&&&&&&&&&&&free(devDetail);&&&
&&&&&&&&&&&&if&(hidHandle==INVALID_HANDLE_VALUE)&&&
&&&&&&&&&&&&{&&&
&&&&&&&&&&&&&&&&SetupDiDestroyDeviceInfoList(hDevInfo);&&&
&&&&&&&&&&&&&&&&free(devDetail);&&&
&&&&&&&&&&&&&&&&return&INVALID_HANDLE_VALUE;&&&
&&&&&&&&&&&&}&&&
&&&&&&&&&&&&_HIDD_ATTRIBUTES&hidA&&&
&&&&&&&&&&&&if(!HidD_GetAttributes(hidHandle,&&hidAttributes))&&&
&&&&&&&&&&&&{&&&
&&&&&&&&&&&&&&&&CloseHandle(hidHandle);&&&
&&&&&&&&&&&&&&&&SetupDiDestroyDeviceInfoList(hDevInfo);&&&
&&&&&&&&&&&&&&&&return&INVALID_HANDLE_VALUE; &&
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!在打开低功耗的情况下,自定义的HID-USB不能被PC识别问题 - 蓝牙Bluetooth 技术 - 德州仪器在线技术支持社区
在打开低功耗的情况下,自定义的HID-USB不能被PC识别问题
发表于1年前
<input type="hidden" id="hGroupID" value="42"
芯片是&a href=&.cn/product/cn/CC2540& target=&extwin&>CC2540&/a> ,协议栈是1.3.2,如果在xPOWER_SAVING的情况下,电路板接到PC的USB口是可以被识别并能正常通信。&/p>
&p>但如果POWER_SAVING,开了低功耗,那么PC就识别不了电路板的HID-USB了,这问题应该怎么解决呢?&/p>&div style=&clear:&>&/div>" />
在打开低功耗的情况下,自定义的HID-USB不能被PC识别问题
此问题已被解答
All Replies
芯片是 ,协议栈是1.3.2,如果在xPOWER_SAVING的情况下,电路板接到PC的USB口是可以被识别并能正常通信。
但如果POWER_SAVING,开了低功耗,那么PC就识别不了电路板的HID-USB了,这问题应该怎么解决呢?
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
榜眼39530分
理解应该是POWER_SAVING的时候USB不能使用。所以。。。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
这个是否能官方确认一下呢,确定开了POWER_SAVING时,USB不能用?
如果真是不能用,是否可以用软件来处理,
如检测到USB插入时,屏蔽POWER_SAVING,使PC枚举USB,如果是从USB切换到电池时(因为我的系统是USB跟电池两种供电方式),再开POWER_SAVING,进入低功耗。但我没有找到POWER_SAVING的开和关函数呢
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
榜眼39530分
这个这个,,,这么跟你说吧。
POWER SAVING模式下,用的是32.768K的晶振工作。这种龟速显然是没法满足USB需求的。USB至少需要精准的12M以上的速度。
所以当你看 dongle的参考设计的时候,上面是没有用32K晶振的,如果你再看dongle的代码,也是不会进入低功耗模式的。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
hi ,&&谢谢你的热心帮助。
如果这样,那么就不能做低功耗了,因为设备是支持USB跟电池供电,如果这样的话,但现在又要兼顾USB功能 ,就不能开POWER SAVING,如果此时又是用了电池的话,那么对电池就比较耗电了。请问Y对于这问题有什么好的两个条件都兼顾的方法或思路不
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
榜眼39530分
没有好的办法,如果你要用USB的话,就不能用低功耗模式,再者,USB本身就是个电老虎 :)
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
我想到一个办法,就是软件上控制进或退出低功耗。
现在有一个IO口可以检测到目前是电池还是USB供电,当如果是电池时,就进入低功耗,如果是USB时就退出低功耗。
而关键的位置是USB的上拉电阻也是由软件控制,只有当USB接入后且退出了低功耗后,再把上拉接上,使PC识别USB有设备接入进而枚举。
进入或退出低功耗模式的代码如下(在void osal_run_system( void )中关于低功耗部分进行改动,增加一个标志位BATT_POWERED_BY进行供电判断):
#if defined( POWER_SAVING )& else& {&&& if (BATT_POWERED_BY)//如果是电池供电,则开低功耗&&& {&&&&&&& osal_pwrmgr_device( PWRMGR_BATTERY );&&& }&&& else//如果是USB供电,则关闭低功耗&&& {&&&&&&& osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); &&& }&&& osal_pwrmgr_powerconserve();&&& }#endif&请问这个osal_pwrmgr_device( PWRMGR_ALWAYS_ON )是否确保能让系统正确退出低功耗模式呢?因为目前用这方式测试,试过识别USB成功,但不是100%,所以还想请教一下。 其实最根本的问题就是怎么软件上控制低功耗进入跟退出。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
按照楼上的方法,是可以实现低功耗进入或退出,但当退出低功耗后,USB依然是未能被识别,具体原因未明,有技术支持回答一下吗
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
上述问题经解决,注意使能USB就行。来回切换模式,USB能用,低功耗也能用
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
探花5847分
一般来说,USB &可以通过DP/DM来唤醒Device,resume的时候,注意在休眠的时候,上拉要一直是能
其他就没有大问题
苦逼创业狗,欢迎交流
You have posted to a forum that requires a moderator to approve posts before they are publicly available.}

我要回帖

更多关于 usb hid协议 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信