搜索
bottom↓
回复: 24

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

[复制链接]

出590入992汤圆

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





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入442汤圆

发表于 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端点传输图像数据。

出590入992汤圆

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


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

出0入0汤圆

发表于 2020-6-5 17:23:35 | 显示全部楼层
64字节是HID传送包数据长度,每次传送确实都是等长,要发的数据长度不超过传送包长度都是可以发送的,但实际有效数据长度则需要自己定义协议来解决。65字节多的那个字节是HID设备的ID,一般都是0,不知道有没有其他值,这个值对于一个固定的设备是固定的。

出0入0汤圆

发表于 2020-6-5 17:25:20 | 显示全部楼层
C#的类,可以解析出长度,这个应该是解析出HID设备的传送包长度,不是传送的有效数据长度

出590入992汤圆

 楼主| 发表于 2020-6-5 17:37:49 | 显示全部楼层
hy317 发表于 2020-6-5 17:23
64字节是HID传送包数据长度,每次传送确实都是等长,要发的数据长度不超过传送包长度都是可以发送的,但实 ...

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

出0入0汤圆

发表于 2020-6-5 20:23:26 | 显示全部楼层
这个跟你的报文描述符有关系,但这个full speed的hid最大就是64的包长

出0入0汤圆

发表于 2020-6-5 20:24:37 | 显示全部楼层
如果你有report id的话,report id占了第一个字节

出0入0汤圆

发表于 2020-6-6 07:26:08 来自手机 | 显示全部楼层
不超过64个字节都可以,数量在报告描述符中确定

出0入0汤圆

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

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

出590入992汤圆

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

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

出0入0汤圆

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

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

出590入992汤圆

 楼主| 发表于 2020-6-6 09:50:05 | 显示全部楼层
hy317 发表于 2020-6-6 09:43
我的意思是单片机这边怎么判断

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

出0入0汤圆

发表于 2020-6-6 10:04:46 | 显示全部楼层
7楼说的对,

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

出590入992汤圆

 楼主| 发表于 2020-6-6 10:08:01 | 显示全部楼层
avr_sz 发表于 2020-6-6 10:04
7楼说的对,

可以代码里搜索:

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

出0入0汤圆

发表于 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),
        },

出0入0汤圆

发表于 2020-6-6 11:54:35 | 显示全部楼层
SUPER_CRJ 发表于 2020-6-6 10:08
那我可以代码中:实时改变长度吗?

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

出0入8汤圆

发表于 2020-6-6 12:09:07 | 显示全部楼层
HID的 包 最大 64  数据可以发送小于64的 。

出0入0汤圆

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

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

出0入0汤圆

发表于 2021-1-7 19:09:13 | 显示全部楼层
学习下缩小型usb

出0入34汤圆

发表于 2021-1-8 08:57:34 | 显示全部楼层
本帖最后由 xyz543 于 2021-1-8 09:03 编辑

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

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

出0入93汤圆

发表于 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的包长度会分包

出0入8汤圆

发表于 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开发仅限于修改芯片厂家提供的官方例程,超出例程设备范围的就爱莫能助了

出0入0汤圆

发表于 2021-2-10 17:17:37 | 显示全部楼层
本帖最后由 ordinary 于 2021-2-10 17:20 编辑

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

出0入18汤圆

发表于 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
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 13:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表