STM32L476RE 键盘仿真每秒按键次数更多

问题描述 投票:0回答:1

我最近将 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);

您可以从调试器快照中看到数据格式正确

debugger snapshot

但是,出来的输出如下图 output from HID keyboard

很多字符被遗漏,尤其是重复的字符,并且一些字符也被输入错误。

keyboard stm32 hid usb-hid
1个回答
0
投票

USB HID 键盘不能以这种方式工作。发送到主机的每个报告都包含一个代码列表(USB 报告描述符定义的 USB 使用代码的索引),代表当前按下的按键。主机通常按顺序处理每个报告的内容,但这并不能保证行为。例如,如果您发送一个指示 X 被按下的报告,然后发送另一个指示 X 被按下的报告,您将在终端上看到一个 X(而不是两个)。

您需要发送全零的报告来表明当前没有按键被按下,以便主机知道按键何时被释放。如果无法以这种方式释放按键,通常会导致主机执行“type-o-matic 键重复”功能(与 USB 无关)。

此外,主机以固定速率轮询 HID 设备以获取输入(每秒 1000 次轮询 - 如果我没记错的话),因此您无法通过发送更大的缓冲区来增加吞吐量。

© www.soinside.com 2019 - 2024. All rights reserved.