打印

GD32 USB HID中断传输如何发送不定长数据

[复制链接]
1406|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
曾兆福|  楼主 | 2020-11-3 18:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
USB HID在发送数据小于报告描述符中规定的数据是,上位机无法接受到数据?下位机如何发送能保证上位机能接收到数据?请大家指教

使用特权

评论回复
沙发
chenjun89| | 2020-11-3 22:58 | 只看该作者
这个没看懂描述。

使用特权

评论回复
板凳
guijial511| | 2020-11-4 07:29 | 只看该作者
如果没有按照手册规定做,是很有可能出问题的。

使用特权

评论回复
地板
曾兆福|  楼主 | 2020-11-4 09:19 | 只看该作者
chenjun89 发表于 2020-11-3 22:58
这个没看懂描述。

列如:报告描述符中规定字节数64,但是我可能只需要发送2个字节,这时发送的两字节无法被上位机接收到

使用特权

评论回复
5
sonicll| | 2020-11-4 09:48 | 只看该作者
HID描述符里有一个字段是报告描述符的长度,你把这个字段配置成你实际要发送的长度试试?

使用特权

评论回复
6
lvben5d| | 2020-11-4 13:24 | 只看该作者
本帖最后由 lvben5d 于 2020-11-4 13:25 编辑

报告描述符中规定的EP包可以发送的数据长度  设计为你这个设备一次通信可以支持的最大值, 实际发送低于这个长度,一点问题都没有。放心。 出问题 是你发送内容 没有按照HID标准协议走吧,毕竟鼠标相关的USB参数标准  都做成全球统一了。

使用特权

评论回复
7
曾兆福|  楼主 | 2020-11-4 14:51 | 只看该作者
lvben5d 发表于 2020-11-4 13:24
报告描述符中规定的EP包可以发送的数据长度  设计为你这个设备一次通信可以支持的最大值, 实际发送低于这 ...

谢谢,我应该是没有描述清楚问题:我的设备与bushound通讯收发没有问题,只要数据小于等于报告描述中规定字节数;当我自己通过wdk或者libhid设计上位机时,在设备发送字节数少于规定的字节数时,上位机无法通过得到数据,只有在所发送字节数与报告描述符中的一致时才能被接收到。
由于我的协议是不定长的,目前我找不到特破点?

使用特权

评论回复
8
曾兆福|  楼主 | 2020-11-4 14:54 | 只看该作者
sonicll 发表于 2020-11-4 09:48
HID描述符里有一个字段是报告描述符的长度,你把这个字段配置成你实际要发送的长度试试? ...

是的,只有在所发送字节数与报告描述符中规定的相同时,才能被正确读到数据。当时我拿到的协议是不定长的
,这时当数据小于报告描述符中规定的字节数时上位机无法收到,我不知道要如何优化这个现象。研究报告描述符也没有任何进展。

使用特权

评论回复
9
lvben5d| | 2020-11-4 16:21 | 只看该作者
曾兆福 发表于 2020-11-4 14:54
是的,只有在所发送字节数与报告描述符中规定的相同时,才能被正确读到数据。当时我拿到的协议是不定长的 ...

你把你的用户字节塞入 USB库函数时候  要指定你FIFO长度,USB总线会中断令牌来取。

使用特权

评论回复
10
曾兆福|  楼主 | 2020-11-4 16:31 | 只看该作者
lvben5d 发表于 2020-11-4 16:21
你把你的用户字节塞入 USB库函数时候  要指定你FIFO长度,USB总线会中断令牌来取。 ...

FIFO的长度不是在初始化的时候就已经定义了么?hid上位机读取不到设备发送的数据(被发送数据小于报告描述符中定义)的问题我在网上看到是普遍现象。FAE又明确和USB库没关系,这个现象有可能和报告描述符有关系么?

使用特权

评论回复
11
lvben5d| | 2020-11-5 15:34 | 只看该作者
我的是BUCK EP,设计512字节最长包,实际我1~200多都可以发过。 你找个USB基本概念PDF看看 找找问题,圈圈教你学USB那PDF不错

使用特权

评论回复
12
曾兆福|  楼主 | 2020-11-6 09:50 | 只看该作者
lvben5d 发表于 2020-11-5 15:34
我的是BUCK EP,设计512字节最长包,实际我1~200多都可以发过。 你找个USB基本概念PDF看看 找找问题,圈圈 ...

你好!放便加微信(15755387613)请教下:HID设备和主机 变长协议通讯问题

使用特权

评论回复
13
chunk| | 2020-11-6 09:53 | 只看该作者
你必须返回与描述符中报告长度等长的数据包。

你可以自己定个协议,比如说首字节是个状态字节,第2第3字节是个长度值L,指明后续数据中有L个字节有效数据,有效数据之后是填充字节。

使用特权

评论回复
14
曾兆福|  楼主 | 2020-11-6 10:25 | 只看该作者
chunk 发表于 2020-11-6 09:53
你必须返回与描述符中报告长度等长的数据包。

你可以自己定个协议,比如说首字节是个状态字节,第2第3字节 ...

协议已经定好了,正常是两个字节。但是有个feature包是32个字节,如果通过端点1(中断传输)报告描述符规定就必须以最大字节去定义,这与协议文档是冲突的了。当然这里有个问题,我不确定feature是不是一定要从中断端点返回,目前没办法接触到客户,这个细节没有披露。第一次做usb类设备。感觉自己走入了死胡同。

使用特权

评论回复
15
chunk| | 2020-11-6 11:33 | 只看该作者
曾兆福 发表于 2020-11-6 10:25
协议已经定好了,正常是两个字节。但是有个feature包是32个字节,如果通过端点1(中断传输)报告描述符规 ...

在windows平台上,FEATURE报告应该是走控制端点的,使用HidD_SetFeature和HidD_GetFeature两个WIN32 API函数完成通信。INPUT/OUTPUT报告在有中断端点的时候走中断传输,没有中断端点的时候也是走控制传输,使用HidD_SetOutputReport和HidD_GetInputReport两个API函数完成通信。

使用特权

评论回复
16
曾兆福|  楼主 | 2020-11-6 13:04 | 只看该作者
chunk 发表于 2020-11-6 11:33
在windows平台上,FEATURE报告应该是走控制端点的,使用HidD_SetFeature和HidD_GetFeature两个WIN32 API ...

我不太确定咱们说的feature是不是同一个,我的feature是指在setreport和getreport中三个output/input/feature的报告数据类型

使用特权

评论回复
评论
chunk 2020-11-9 13:13 回复TA
是同一个,我用的是WIN32 API,你用了第三方的库吧? 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

12

帖子

0

粉丝