xie2101 发表于 2025-9-11 14:17:39

请教一下 例子程序 《76-通过USB HID协议打印数据信息-可用于调试》

在 STC32G12K128 的 例子《76-通过USB HID协议打印数据信息-可用于调试》 中


1.硬件连接方式:usb直接接电脑。
   

2. 烧写。
3. 烧写后设备管理器中可以看到:




4. 查看例子,可以看到对应按键。



5. 原理图


6. 按了按键后,升级工具端看到的效果。
hex:


str:







为啥看到的不是 0x1234abcd ?

国芯人工智能 发表于 2025-9-11 14:18:00

在《76-通过USB HID协议打印数据信息-可用于调试》这一示例程序中,用户提出的问题是:为何在按下按键后,通过升级工具端看到的数据并非预期的 0x1234ABCD?

我们可以从以下几个方面进行分析:

一、USB HID通信机制简介

HID(Human Interface Device)协议是USB设备类规范中的一种,广泛用于键盘、鼠标、游戏手柄等设备。其特点是无需安装驱动即可在操作系统中被识别,适用于快速调试与数据传输。

在本示例中,STC32G12K128单片机作为HID设备与PC通信。其数据传输方式是通过中断端点进行数据的上传与下发。HID设备上报给主机的数据格式,由报告描述符(Report Descriptor)定义。

二、示例程序功能分析

本例中,程序的功能是:
配置STC32G12K128为USB HID设备;
按键按下后,将预设数据(如0x1234ABCD)以HID数据包形式发送至PC;
PC端通过升级工具接收并显示该数据。

关键点包括:
数据打包方式;
报告描述符的结构;
发送端(MCU)与接收端(PC工具)的数据解析方式是否一致。

三、为什么没有看到 0x1234ABCD?

1. 数据打包格式不一致

在USB HID通信中,发送的数据是以字节流形式发送的,通常以小端格式(Little Endian)进行传输。例如,32位整数 0x1234ABCD 在内存中以字节形式表示为:

地址低 → 高:CD AB 34 12

如果PC端接收后以大端格式(Big Endian)解析,就会变成 0xCDAB3412,从而与预期不符。

解决方法:
确认MCU发送时的数据顺序;
确认PC端接收后是否进行了正确的字节序转换。

2. 报告描述符未正确配置

HID设备发送的数据结构由报告描述符定义。若报告描述符中定义的字段长度、类型或逻辑值与实际发送的数据不匹配,可能导致PC端解析错误。

例如,如果报告描述符中定义的是16位字段,而你发送的是32位数据,则PC端只会解析前两个字节。

建议检查:
报告描述符中字段长度是否为32位;
是否使用了多个字段拼接;
是否使用了数组或位域方式定义数据。

3. 数据发送方式与接收端解析方式不一致

在示例中,MCU可能以原始字节流方式发送数据,而PC端的升级工具可能按某种自定义协议进行解析。例如:
发送的是十六进制数据,但工具按ASCII显示;
数据中包含HID报告ID,未被正确跳过;
数据格式中包含状态字节、校验码等附加信息。

解决方法:
检查发送端数据结构;
查看接收端工具是否支持原始数据查看;
使用Wireshark或USB协议分析工具抓包分析实际发送的数据内容。

四、调试建议

为了更清晰地定位问题,建议采取以下步骤:

1. 使用USB协议分析工具(如Wireshark、USBlyzer)抓包分析实际发送的数据;
2. 确认MCU发送的数据内容与顺序;
3. 确认PC端接收工具是否按正确格式解析;
4. 尝试发送简单数据(如0x01, 0x02, 0x03, 0x04)观察接收结果;
5. 在代码中添加调试输出(如串口打印发送缓冲区内容);

五、示例代码片段分析(假设)

假设发送函数如下:

c
uint8t buffer = {0xCD, 0xAB, 0x34, 0x12}; // 小端格式
HIDSendReport(buffer, 4);

此时发送的数据是 0xCDAB3412,但若PC端以大端解析,会误认为是 0x1234ABCD。因此,需要在接收端进行字节顺序转换。

六、结论

用户未看到预期的 0x1234ABCD 的主要原因,可能包括:
字节序(大小端)问题;
报告描述符定义与实际数据不匹配;
发送数据结构与接收端解析方式不一致;
数据中包含额外字段(如报告ID、校验码等)未被正确识别。

七、推荐解决步骤

1. 确认MCU发送的原始数据内容与顺序;
2. 确认报告描述符是否与数据格式匹配;
3. 使用协议分析工具验证实际发送的数据;
4. 在接收端进行正确的数据解析与字节序转换;
5. 尝试发送固定简单数据进行验证。

如需进一步分析,建议提供:
报告描述符内容;
发送端完整数据结构;
接收端解析方式说明;
协议分析截图或数据包内容。

欢迎继续交流,以便更深入定位问题。

[本文内容由国芯人工智能辅助生成,仅供参考]

西西研究员 发表于 2025-9-11 14:49:03

推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接
https://v.stcai.com/sv/e49742d-1978afcb431/e49742d-1978afcb431.mp4
上面是 小李 演示:STC8H8K64U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成
https://v.stcai.com/sv/61d1aa5-1978c2a6adb/61d1aa5-1978c2a6adb.mp4
上面是 小赵 演示:STC8H8K64U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成

DebugLab 发表于 2025-9-11 16:12:16

usb.h文件要屏蔽掉SEGLED这个定义

HID这个定义不要屏蔽(图中是CDC的设置)

xie2101 发表于 2025-9-12 06:50:36

DebugLab 发表于 2025-9-11 16:12
usb.h文件要屏蔽掉SEGLED这个定义

HID这个定义不要屏蔽(图中是CDC的设置)


感谢回复。试过了,可以了。


页: [1]
查看完整版本: 请教一下 例子程序 《76-通过USB HID协议打印数据信息-可用于调试》