SUPER_CRJ 发表于 2020-6-5 11:55:08

STM32F1的USB HID发送接收每次必须长度是64吗?

刚刚调试通了,STM32的USB HID与上位机通信。
有几个个疑问:
1:使用开源的HIDSharp和一个调试HID的调试助手:发送命令(HID SHARP)或者调试助手输入不管是多少字节,最终STM32里面显示都是收到了:64字节大小。
2:在STM32中如果设置发送的大小:不是64,则上位机收不到!但是STM32也会显示发送成功。
3:在发送和接收中:虽然是64字节,但是BUS HOUND监测中:有时候是:65字节,有时候是64字节。但是最终解析出来的都是:64字节的有效数据,这个65字节是前面多了一个:0,请问是什么原因?





wye11083 发表于 2020-6-5 14:55:14

以前调过USB CDC,没注意过你说的这种情况。CDC要求至少一个中断端点,就用了端点0,然后收一批数据打个包发一批。当每个包<=16B时,windows超级终端可以正常工作,当每个包>16B时,超级终端可能导致系统蓝屏,用putty或securecrt正常。包长度是FX2的寄存器控制的,CDC的每个包就是一堆数据,印象中没有包头信息。

所以你最好去查查HID规范,每种HID协议都有固定需要遵守的一些信息,如果你不按规范来肯定会出问题。CDC只是其中一种协议。UVC是另一种,UVC最简单的是YUY2,简单打个包就能传出来,至少得有一个bulk或iso端点传输图像数据。

SUPER_CRJ 发表于 2020-6-5 17:16:20

wye11083 发表于 2020-6-5 14:55
以前调过USB CDC,没注意过你说的这种情况。CDC要求至少一个中断端点,就用了端点0,然后收一批数据打个包 ...

谢谢大神。
CDC自己做了,没有这个问题,设置多少个就是多少。就是HID不一样,记得之前看到资料时候有说:一个C#的类,可以解析出长度。所以比较晕

hy317 发表于 2020-6-5 17:23:35

64字节是HID传送包数据长度,每次传送确实都是等长,要发的数据长度不超过传送包长度都是可以发送的,但实际有效数据长度则需要自己定义协议来解决。65字节多的那个字节是HID设备的ID,一般都是0,不知道有没有其他值,这个值对于一个固定的设备是固定的。

hy317 发表于 2020-6-5 17:25:20

C#的类,可以解析出长度,这个应该是解析出HID设备的传送包长度,不是传送的有效数据长度

SUPER_CRJ 发表于 2020-6-5 17:37:49

hy317 发表于 2020-6-5 17:23
64字节是HID传送包数据长度,每次传送确实都是等长,要发的数据长度不超过传送包长度都是可以发送的,但实 ...

谢谢,我STM32用的也是: TeenyUSB,不过我是把里面的核心都抽出来了,重写的。TeenyUSB也比以前越来越大了。

nongxiaoming 发表于 2020-6-5 20:23:26

这个跟你的报文描述符有关系,但这个full speed的hid最大就是64的包长

nongxiaoming 发表于 2020-6-5 20:24:37

如果你有report id的话,report id占了第一个字节

desertsailor 发表于 2020-6-6 07:26:08

不超过64个字节都可以,数量在报告描述符中确定

hy317 发表于 2020-6-6 09:35:17

SUPER_CRJ 发表于 2020-6-5 17:37
谢谢,我STM32用的也是: TeenyUSB,不过我是把里面的核心都抽出来了,重写的。TeenyUSB也比以前越来越大 ...

厉害,顺便请教一下TeenyUSB可以查询到有没有成功跟电脑连接吗?CDC怎么判断电脑串口的打开和关闭?

SUPER_CRJ 发表于 2020-6-6 09:38:35

hy317 发表于 2020-6-6 09:35
厉害,顺便请教一下TeenyUSB可以查询到有没有成功跟电脑连接吗?CDC怎么判断电脑串口的打开和关闭? ...

和电脑连接,我是判断有没有分配地址。
CDC我还没有研究透彻,但是打开串口会分配波特率等参数。关闭就不清楚了。

hy317 发表于 2020-6-6 09:43:57

SUPER_CRJ 发表于 2020-6-6 09:38
和电脑连接,我是判断有没有分配地址。
CDC我还没有研究透彻,但是打开串口会分配波特率等参数。关闭就不 ...

我的意思是单片机这边怎么判断

SUPER_CRJ 发表于 2020-6-6 09:50:05

hy317 发表于 2020-6-6 09:43
我的意思是单片机这边怎么判断

就是单片机啊。
连接电脑后,单片机一个地址寄存器会从0变成其它值。
CDC串口电脑打开后,单片机会收到设置参数的命令(但是我做的CDC没有处理这里。因为TeenyUSB没有处理。。)

avr_sz 发表于 2020-6-6 10:04:46

7楼说的对,

可以代码里搜索:
wMaxPacketSize: 64 Bytes max
REPORT_COUNT (64Byte)
是不是设的 64

SUPER_CRJ 发表于 2020-6-6 10:08:01

avr_sz 发表于 2020-6-6 10:04
7楼说的对,

可以代码里搜索:


那我可以代码中:实时改变长度吗?

hy317 发表于 2020-6-6 10:24:17

SUPER_CRJ 发表于 2020-6-6 10:08
那我可以代码中:实时改变长度吗?

谢谢。
不能实时改变长度,长度是在单片机的HID设备描述里定义的
      USB_HID{
            ReadEp = EndPoint(IN(1),Interrupt, 64),
            WriteEp = EndPoint(OUT(1), Interrupt, 64),
            report = HID_InOut(64),
      },

avr_sz 发表于 2020-6-6 11:54:35

SUPER_CRJ 发表于 2020-6-6 10:08
那我可以代码中:实时改变长度吗?

我认为是可以实时改变长度的,固定长度的传输显然不够灵活。HID协议都是高手制定的,而且还不是一个人,想必他们能考虑到这个。
建议查一下上位机的做法,我觉得和上位机有关系

kebaojun305 发表于 2020-6-6 12:09:07

HID的 包 最大 64数据可以发送小于64的 。

huangqi412 发表于 2020-6-12 14:06:57

SUPER_CRJ 发表于 2020-6-5 17:16
谢谢大神。
CDC自己做了,没有这个问题,设置多少个就是多少。就是HID不一样,记得之前看到资料时候有说 ...

HID描述符指定了固定长度,   全速最多64,可以小于64,但是长度是固定的。

xaviersw 发表于 2021-1-7 19:09:13

学习下缩小型usb

xyz543 发表于 2021-1-8 08:57:34

本帖最后由 xyz543 于 2021-1-8 09:03 编辑

记得貌似有可以设置超过并完美解决 64 字节的方法,是在 MicroChip 官网的 USB 应用上,早年听长官有提到过。

※ 编辑原因:抱歉,刚说错!记得应该是在 SiliconLabs 官网的 USB 应用上,因已约是近十年前的事,有点忘了!

takashiki 发表于 2021-1-8 09:19:25

xyz543 发表于 2021-1-8 08:57
记得貌似有可以设置超过并完美解决 64 字节的方法,是在 MicroChip 官网的 USB 应用上,早年听长官有提到过 ...

USB HID的包长度和64字节啥关系没有,都是被国内一帮资料以及STM32的USB包最大64字节害的。HID的包和USB的包根本不是一个东西。
远在AVR还如日中天的时代,软件模拟的USB HID一个包最大就可以搞到255字节,还是低速的,没道理到了全速了反而还降低。日本就有家伙搞了个hidspx,AVR模拟的HID烧写器,传输速度大概7kB/s的样子,我用Bus Hound测试过,远远超出各类教科书说的10ms不超过一次事务,每秒传输不超过800字节的说法,这些说法根本就是不负责任的。我也在这个坛子里问过,没有一个回答上的,后来用Bus Hound才发现,所谓的不超过800字节是指中断传输,教科书有意无意的忽略这个前提,hidspx全部走控制传输每1ms都有事务或数据。
HID发送接收的数据长度是由ID决定的,每一个ID决定了该包的长度,超过了USB的包长度会分包

canspider 发表于 2021-1-8 09:27:33

takashiki 发表于 2021-1-8 09:19
USB HID的包长度和64字节啥关系没有,都是被国内一帮资料以及STM32的USB包最大64字节害的。HID的包和USB ...

正解,Windows上的multi-touch digitizer就是hid设备,它的hybrid包是超过了端点最大包长的
Xbox的手柄数据也超过了最大包长
国内的USB开发仅限于修改芯片厂家提供的官方例程,超出例程设备范围的就爱莫能助了

ordinary 发表于 2021-2-10 17:17:37

本帖最后由 ordinary 于 2021-2-10 17:20 编辑

理论上HID包长最大是65534,受限于描述符中代表包长度的2byte数据。
在上位机会自动分成端点的最大长度分批输出,在单片机上收到0或小于最大端点包长的数据即可认为一个HID包结束。
上行的数据处理一样,上位机驱动组包。

tang_qianfeng 发表于 2023-3-8 21:58:12

avr_sz 发表于 2020-6-6 11:54
我认为是可以实时改变长度的,固定长度的传输显然不够灵活。HID协议都是高手制定的,而且还不是一个人, ...
(引用自17楼)

那个问题我也遇到了,我设置report的长度为64,pc端调用hid.lib, 发送数据正好64是没问题的,发送小于64字节则不发送,大于64字节则只发送64字节,对于接收,则无限制
我用的是hid_setfeature和hid_getfeature这两个api
页: [1]
查看完整版本: STM32F1的USB HID发送接收每次必须长度是64吗?