我最近将 STM32L476 用作 HID 键盘,我可以在其中发送按键,但对于我的用例来说它非常慢。我遵循了一个典型的例子就像这个。
我观察到,当我尝试向 USBD_HID_SendReport API 提供更大一点的符合 HID 报告格式的自定义负载时,数据传输速度会稍快一些,因为所有按键都会立即完成。但是我想知道是否有更好的方法来做到这一点,而不是自己手动构建阵列。
我现在发送的示例数组是
{0x00.0x00,0x04,0x05,0x07,0x08,0x09,0x0A,0x00,0x00,0xB,0xC,0xD,0xE,0xF,0x10,0x00,0x00,.......}
这里每 8 个字节的前 2 个字节是 0x00,因为第一个字节是修饰符,第二个字节是保留的,接下来的 6 个字节是 HID 键盘扫描码数据,在这种情况下为 ASCII A、B、C、D、E、F、G等等,附后。
如果我的解释没有意义,请告诉我。
我已经发送了以下数组
final[0] uint8_t 0x0 (Hex)
final[1] uint8_t 0x0 (Hex)
final[2] uint8_t 0xc (Hex)
final[3] uint8_t 0x16 (Hex)
final[4] uint8_t 0x12 (Hex)
final[5] uint8_t 0x1e (Hex)
final[6] uint8_t 0x22 (Hex)
final[7] uint8_t 0x23 (Hex)
final[8] uint8_t 0x0 (Hex)
final[9] uint8_t 0x0 (Hex)
final[10] uint8_t 0x26 (Hex)
final[11] uint8_t 0x20 (Hex)
final[12] uint8_t 0x2d (Hex)
final[13] uint8_t 0x19 (Hex)
final[14] uint8_t 0x2c (Hex)
final[15] uint8_t 0x17 (Hex)
final[16] uint8_t 0x0 (Hex)
final[17] uint8_t 0x0 (Hex)
final[18] uint8_t 0x4 (Hex)
final[19] uint8_t 0xa (Hex)
final[20] uint8_t 0x2d (Hex)
final[21] uint8_t 0x2c (Hex)
final[22] uint8_t 0x26 (Hex)
final[23] uint8_t 0x25 (Hex)
final[24] uint8_t 0x0 (Hex)
final[25] uint8_t 0x0 (Hex)
final[26] uint8_t 0x2c (Hex)
final[27] uint8_t 0x9 (Hex)
final[28] uint8_t 0x24 (Hex)
final[29] uint8_t 0x2c (Hex)
final[30] uint8_t 0x1e (Hex)
final[31] uint8_t 0x4 (Hex)
final[32] uint8_t 0x0 (Hex)
final[33] uint8_t 0x0 (Hex)
final[34] uint8_t 0x2c (Hex)
final[35] uint8_t 0x27 (Hex)
final[36] uint8_t 0x4 (Hex)
final[37] uint8_t 0x2c (Hex)
final[38] uint8_t 0x27 (Hex)
final[39] uint8_t 0x25 (Hex)
final[40] uint8_t 0x0 (Hex)
final[41] uint8_t 0x0 (Hex)
final[42] uint8_t 0x2c (Hex)
final[43] uint8_t 0x27 (Hex)
final[44] uint8_t 0x1e (Hex)
final[45] uint8_t 0x2c (Hex)
final[46] uint8_t 0x27 (Hex)
final[47] uint8_t 0x21 (Hex)
final[48] uint8_t 0x0 (Hex)
final[49] uint8_t 0x0 (Hex)
final[50] uint8_t 0x2c (Hex)
final[51] uint8_t 0x8 (Hex)
final[52] uint8_t 0x27 (Hex)
final[53] uint8_t 0xd (Hex)
final[54] uint8_t 0x28 (Hex)
final[55] uint8_t 0x0 (Hex)
USBD_HID_SendReport(&hUsbDeviceFS,&final,56);
HAL_Delay(150);
memset(&final,0x00,56);
USBD_HID_SendReport(&hUsbDeviceFS,&final,56);
HAL_Delay(150);
您可以从调试器快照中看到数据格式正确
很多字符被遗漏,尤其是重复的字符,并且一些字符也被输入错误。
USB HID 键盘不能以这种方式工作。发送到主机的每个报告都包含一个代码列表(USB 报告描述符定义的 USB 使用代码的索引),代表当前按下的按键。主机通常按顺序处理每个报告的内容,但这并不能保证行为。例如,如果您发送一个指示 X 被按下的报告,然后发送另一个指示 X 被按下的报告,您将在终端上看到一个 X(而不是两个)。
您需要发送全零的报告来表明当前没有按键被按下,以便主机知道按键何时被释放。如果无法以这种方式释放按键,通常会导致主机执行“type-o-matic 键重复”功能(与 USB 无关)。
此外,主机以固定速率轮询 HID 设备以获取输入(每秒 1000 次轮询 - 如果我没记错的话),因此您无法通过发送更大的缓冲区来增加吞吐量。