qhlltiwg 发表于 2025-9-19 22:03:15

使用STC8H8K64U核心板做成虚拟键盘输出


使用STC8H8K64U核心板,参考17-USB-CDC虚拟串口转串口+USB-HID键盘的复合设备的例程修改,
怎么修改成为虚拟键盘呀,我想把另外一个传感器接收到的数据通过虚拟键盘输出到电脑,该怎么修改例程呀

国芯人工智能 发表于 2025-9-19 22:08:00

你好!你提到使用 STC8H8K64U 核心板,并参考 “17-USB-CDC虚拟串口转串口+USB-HID键盘的复合设备” 的例程,希望将其修改为一个 虚拟键盘设备,并能将另一个传感器的数据通过虚拟键盘的形式输出到电脑上。下面我将从几个方面为你提供专业性的指导,帮助你完成该目标。

一、理解USB HID键盘的基本原理

USB HID(Human Interface Device)是一种标准设备类,用于与人机交互设备通信,如键盘、鼠标等。HID键盘通过发送按键扫描码(Key Code)来模拟按键动作。

1.1 HID键盘的数据格式(Report Descriptor)

HID设备通过描述符(Report Descriptor)定义其数据格式。对于标准键盘,通常包含如下字段:
Modifier(修饰键,如Ctrl、Shift等)
Reserved(保留)
Key Codes(最多6个普通按键)

例如一个标准键盘的HID Report结构如下(单位:bit):

8 bits: Modifier
8 bits: Reserved
8 bits: Key Code 1
8 bits: Key Code 2
8 bits: Key Code 3
8 bits: Key Code 4
8 bits: Key Code 5
8 bits: Key Code 6

所以每个HID键盘包是 8字节,用于描述当前按下的按键状态。

1.2 标准键盘扫描码

可以参考USB HID Usage Tables中的标准键盘扫描码(如A=0x04,B=0x05等)。你可以通过查找表将字符或数字转换为对应的键码。

二、STC8H8K64U的USB功能支持

STC8H8K64U支持USB 2.0 Full Speed(12Mbps),并内置USB控制器,可以实现HID设备、CDC虚拟串口等功能。其SDK中通常包含多个USB复合设备的例程,比如你提到的 CDC+HID 的复合设备例程。

2.1 复合设备的结构

复合设备(Composite Device)是指一个USB设备同时具有多个功能接口,例如:
接口0:CDC类(虚拟串口)
接口1:HID类(键盘)

你可以选择只保留HID接口,或者继续保留CDC用于调试。

三、如何修改例程实现虚拟键盘功能

你已经参考了“17-USB-CDC虚拟串口转串口+USB-HID键盘”的例程,说明你已经具备USB复合设备的基础知识。下面我将指导你如何专注于实现HID键盘功能。

3.1 修改设备描述符和HID描述符

在USB描述符中,需要确保:
bDeviceClass = 0x00(接口定义类)
bInterfaceClass = 0x03(HID类)
bInterfaceSubClass = 0x00(非启动设备)
bInterfaceProtocol = 0x00(无协议)

在HID描述符中指定Report Descriptor的长度和地址。

3.2 编写或修改Report Descriptor

你需要在代码中定义一个标准的键盘Report Descriptor,例如:

c
const uint8t hidkeyboardreportdesc[] = {
    0x05, 0x01,      // USAGEPAGE (Generic Desktop)
    0x09, 0x06,      // USAGE (Keyboard)
    0xA1, 0x01,      // COLLECTION (Application)
    0x05, 0x07,      //   USAGEPAGE (Keyboard/Keypad)
    0x19, 0xE0,      //   USAGEMINIMUM (Keyboard LeftControl)
    0x29, 0xE7,      //   USAGEMAXIMUM (Keyboard Right GUI)
    0x15, 0x00,      //   LOGICALMINIMUM (0)
    0x25, 0x01,      //   LOGICALMAXIMUM (1)
    0x75, 0x01,      //   REPORTSIZE (1)
    0x95, 0x08,      //   REPORTCOUNT (8)
    0x81, 0x02,      //   INPUT (Data,Var,Abs)
    0x95, 0x01,      //   REPORTCOUNT (1)
    0x75, 0x08,      //   REPORTSIZE (8)
    0x81, 0x03,      //   INPUT (Const,Var,Abs)
    0x95, 0x06,      //   REPORTCOUNT (6)
    0x75, 0x08,      //   REPORTSIZE (8)
    0x15, 0x00,      //   LOGICALMINIMUM (0)
    0x25, 0x65,      //   LOGICALMAXIMUM (101)
    0x05, 0x07,      //   USAGEPAGE (Keyboard/Keypad)
    0x19, 0x00,      //   USAGEMINIMUM (Reserved (no event indicated))
    0x29, 0x65,      //   USAGEMAXIMUM (Keyboard Application)
    0x81, 0x00,      //   INPUT (Data,Array,Abs)
    0xC0               // ENDCOLLECTION
};

3.3 实现HID数据发送函数

你需要实现一个函数,用于构造并发送HID键盘数据包。例如:

c
void SendKeyboardReport(uint8t modifier, uint8t key1, uint8t key2, uint8t key3, uint8t key4, uint8t key5, uint8t key6)
{
    uint8t buf = {0};

    buf = modifier; // 修饰键
    buf = key1;
    buf = key2;
    buf = key3;
    buf = key4;
    buf = key5;
    buf = key6;

    USBDHIDSendReport(buf, 8);
}

3.4 模拟按键按下与释放

每次发送完按键后,需要发送一个“释放”包(所有键码清零)来模拟按键松开:

c
SendKeyboardReport(0, 0, 0, 0, 0, 0, 0); // 释放所有按键

四、如何将传感器数据映射为键盘输入

你提到希望将传感器接收到的数据通过虚拟键盘输出到电脑,这需要将数据“编码”为对应的键盘键码。

4.1 数据映射策略
如果是数字数据(如温度、湿度等),可以将其转换为ASCII字符,再映射为对应键码。
如果是状态数据(如开关、按钮),可直接映射为特定键(如F1-F12)。

例如:

c
// 将字符 'A' 转换为键码
uint8t keycode = 'A' - 'A' + 0x04; // A=0x04, B=0x05 ...
SendKeyboardReport(0, keycode, 0, 0, 0, 0, 0);

4.2 示例:发送字符串“HELLO”

```c
void SendString(const char str)
{
    while (str) {
      uint8t code = 0;
      if (str >= 'A' && str = 'a' && str = '1' && str

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

神农鼎 发表于 2025-9-19 23:11:35



USB拓展库及使用示例 | 本贴 咨询 USB,基本帮您把USB程序开发完成 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯人工智能技术交流网站 - AI32位8051交流社区
页: [1]
查看完整版本: 使用STC8H8K64U核心板做成虚拟键盘输出