找回密码
 立即注册
查看: 71|回复: 4

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:44
  • 最近打卡:2025-09-18 08:05:37

6

主题

77

回帖

364

积分

中级会员

积分
364
发表于 7 天前 | 显示全部楼层 |阅读模式
STC32G12K128 的 例子  《76-通过USB HID协议打印数据信息-可用于调试》 中


1.硬件连接方式:usb直接接电脑。
截图202509111409028325.jpg    

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

截图202509111410426650.jpg


4. 查看例子,可以看到对应按键。
截图202509111403451403.jpg


5. 原理图
截图202509111404596650.jpg

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

str:
截图202509111414385640.jpg


截图202509120642188499.jpg



为啥看到的不是 0x1234abcd ?

回复

使用道具 举报 送花

3

主题

1967

回帖

782

积分

等待验证会员

积分
782
发表于 7 天前 | 显示全部楼层
在《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 在内存中以字节形式表示为:
  1. 地址低 → 高: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. 在代码中添加调试输出(如串口打印发送缓冲区内容);

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

假设发送函数如下:
  1. c
  2. uint8t buffer[4] = {0xCD, 0xAB, 0x34, 0x12}; // 小端格式
  3. HIDSendReport(buffer, 4);
复制代码

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

六、结论

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

七、推荐解决步骤

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

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

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:35
  • 最近打卡:2025-09-18 08:30:32

16

主题

120

回帖

1090

积分

版主

积分
1090
发表于 7 天前 | 显示全部楼层
推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接

上面是 小李 演示:STC8H8K64U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成

上面是 小赵 演示:STC8H8K64U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:562
  • 最近打卡:2025-09-18 04:56:45
已绑定手机

86

主题

6142

回帖

1万

积分

超级版主

积分
11378
发表于 7 天前 | 显示全部楼层
usb.h文件要屏蔽掉SEGLED这个定义
截图202509111611362798.jpg
HID这个定义不要屏蔽(图中是CDC的设置)
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:44
  • 最近打卡:2025-09-18 08:05:37

6

主题

77

回帖

364

积分

中级会员

积分
364
发表于 6 天前 | 显示全部楼层
Debu*** 发表于 2025-9-11 16:12
usb.h文件要屏蔽掉SEGLED这个定义

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

感谢回复。试过了,可以了。
截图202509120650306574.jpg

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-9-18 19:35 , Processed in 0.121744 second(s), 77 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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