STM32 HID键盘

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

我正在尝试使用和 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 进行了必要的更改,以及 Clock 配置和启用 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

有什么想法吗?

2

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

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

连续插入键的原因表示未收到空报告。即使该函数使用术语sendUSBD_HID_SendReport()),USB 协议的工作原理也使主机需要拾取输入报告。而且由于它是 USB 中断端点,因此这种情况经常发生。如果尚未提取报告,则USBD_HID_SendReport()将不执行任何操作。它甚至不会返回错误。

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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(338)
如何在VisualStudio中自动格式化代码
上一篇
替换.nfo文件中的文本
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(47条)