gpt4 book ai didi

STM32 HID 键盘

转载 作者:行者123 更新时间:2023-12-05 04:31:23 29 4
gpt4 key购买 nike

我正在尝试将 STM32F0-disco 用作 Windows PC 的键盘。正在打印的字符有问题。

下面的代码等到板载按钮被按下,然后应该打印一次这三个字符。

    /* USER CODE BEGIN 2 */

USBDelay = USBD_HID_GetPollingInterval(&hUsbDeviceFS);
while (HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == 0);
if (HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == 1) {
HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);


buff[0] = 0x00;
buff[2] = 0x04;
buff[3] = 0x05;
buff[4] = 0x06;
USBD_HID_SendReport(&hUsbDeviceFS, buff, 8);
HAL_Delay(USBDelay);

buff[0] = 0x00;
buff[2] = 0x00;
buff[3] = 0x00;
buff[4] = 0x00;

USBD_HID_SendReport(&hUsbDeviceFS, buff, 8);
HAL_GPIO_TogglePin(LD4_GPIO_Port, LD4_Pin);
HAL_Delay(1000);
}
while (HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == 1);

/* USER CODE END 2 */

我遇到的问题是缓冲区前两个关键位置中唯一的字符(这将是数组的第三个和第四个元素,因为元素一是修饰符而第二个元素是保留的)。此外,字符不是打印一次,而是连续打印而不停止。

根据我为测试目的添加的 LED,我要打印的字符在第二个 USB_SendReport 之前不会打印,它应该发送空白字符以停止打印。

我已对 usbd_hid.c 和 usbd_hid.h 以及时钟配置和启用 USB 等进行了必要的更改。我把我的键盘描述符放在下面。

    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x05, // USAGE_MAXIMUM (Kana)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0 // END_COLLECTION

有什么想法吗?

最佳答案

USB HID 协议(protocol)的工作方式与您想象的不同。如果输入报告包含多个按下的键,主机(您的 Windows PC)会假定它们是同时按下的。所以它们可以按任何顺序插入。这也可能是第三个 key 未插入的原因。

因此您需要为每个键发送单独的输出报告。在最后一份报告之后,您需要发送另一个空报告(全为 0)以指示 key 已被释放(正如您已经在做的那样)。在同一键的两次按下之间也需要这样的额外报告。

连续插入 key 的原因表明没有收到空报告。尽管该函数使用术语发送 (USBD_HID_SendReport()),但 USB 协议(protocol)的工作方式使得主机需要获取输入报告。由于它是一个 USB 中断端点,因此这种情况只会经常发生。如果尚未提取报告,USBD_HID_SendReport() 不执行任何操作。它甚至不返回错误。

虽然查询轮询间隔 (USBD_HID_GetPollingInterval()) 起初看起来没问题,但它是 USB 端点描述符中声明的轮询间隔。但是,Windows 只支持几个间隔值并四舍五入到下一个支持的值。所以你必须增加值(value)。

关于STM32 HID 键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71847789/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com