zoukankan      html  css  js  c++  java
  • 使用STM32CubeMX生成USB_HOST_HID工程[添加对CAPS_LOCK指示灯的控制][SetReport]

    在之前(使用STM32CubeMX生成USB_HOST_HID工程)的基础上进行修改

    在结合之前在pc上的测试 USB之HID类Set_Report Request[调试手记1]

    测试代码如下:

    /* USER CODE BEGIN 1 */
    void USBH_HID_EventCallback(USBH_HandleTypeDef *phost)
    {
       HID_TypeTypeDef   type = HID_UNKNOWN;
       
       USBH_ErrLog("USBH_HID_EventCallback");
       
       type = USBH_HID_GetDeviceType(phost);
       
       switch(type)
       {
           case HID_KEYBOARD:
           {
                HID_KEYBD_Info_TypeDef *keyboard_info;            
                char ascii;
                uint8_t reportBuff[1];
          static uint8_t led_flag =0;
                
                keyboard_info = USBH_HID_GetKeybdInfo(phost);
    
                if( keyboard_info != NULL )
                {
                    ascii = USBH_HID_GetASCIICode(keyboard_info);
                    if( ascii != 0 )
                    {
                        USBH_UsrLog("%c",ascii);
                    }
                    
    //                USBH_UsrLog("state %x",keyboard_info->state);
    //                USBH_UsrLog("lctrl %x",keyboard_info->lctrl);
    //                USBH_UsrLog("lshift %x",keyboard_info->lshift);
    //                USBH_UsrLog("lalt %x",keyboard_info->lalt);
    //                USBH_UsrLog("lgui %x",keyboard_info->lgui);
    //                USBH_UsrLog("rctrl %x",keyboard_info->rctrl);
    //                USBH_UsrLog("rshift %x",keyboard_info->rshift);
    //                USBH_UsrLog("rgui %x",keyboard_info->rgui);
                    
                    USBH_UsrLog("keys[6] %x %x %x %x %x %x ",keyboard_info->keys[0],
                                                             keyboard_info->keys[1],
                                                             keyboard_info->keys[2],
                                                             keyboard_info->keys[3],
                                                             keyboard_info->keys[4],
                                                             keyboard_info->keys[5]);
                    
                    if(keyboard_info->keys[0] == 0x39)
                    {
                        led_flag=~led_flag;
                        if(led_flag)
                        {
                            reportBuff[0] = 0X02;
                            USBH_HID_SetReport (phost,2,0,reportBuff,1);
                            USBH_UsrLog("reportBuff %02x ",reportBuff[0]);
                        }
                        else
                        {
                            reportBuff[0] = 0X00;
                            USBH_HID_SetReport (phost,2,0,reportBuff,1);
                            USBH_UsrLog("reportBuff %02x ",reportBuff[0]);
                        }
    
                    }
                    
                }
                
    
    
    
           }     
           break;
           
           case HID_MOUSE:
           {  
               HID_MOUSE_Info_TypeDef *mouse_info;
               
               mouse_info = USBH_HID_GetMouseInfo(phost);
               USBH_UsrLog("mouse_info X%d, Y%d ,button %d %d %d",mouse_info->x,mouse_info->y,mouse_info->buttons[2],mouse_info->buttons[1],mouse_info->buttons[0]);
           }
           break;
           
           default:
           break;
       }
    }
    /* USER CODE END 1 */

    通过capslock按键按下和释放等可以看到CAPS_LOCK指示灯变化。但是会发现需要按多次才能翻转CAPS_LOCK指示灯。

    而我们在rtt中可以看到我们赋值reportBuff正常变化。

     我们继续给USBH_HID_SetReport的返回结果加log信息。

    /* USER CODE BEGIN 1 */
    void USBH_HID_EventCallback(USBH_HandleTypeDef *phost)
    {
       HID_TypeTypeDef   type = HID_UNKNOWN;
       
       USBH_ErrLog("USBH_HID_EventCallback");
       
       type = USBH_HID_GetDeviceType(phost);
       
       switch(type)
       {
           case HID_KEYBOARD:
           {
                HID_KEYBD_Info_TypeDef *keyboard_info;            
                char ascii;
                uint8_t reportBuff[1];
                USBH_StatusTypeDef status         = USBH_BUSY;
                static uint8_t led_flag =0;
                
                keyboard_info = USBH_HID_GetKeybdInfo(phost);
    
                if( keyboard_info != NULL )
                {
                    ascii = USBH_HID_GetASCIICode(keyboard_info);
                    if( ascii != 0 )
                    {
                        USBH_UsrLog("%c",ascii);
                    }
                    
    //                USBH_UsrLog("state %x",keyboard_info->state);
    //                USBH_UsrLog("lctrl %x",keyboard_info->lctrl);
    //                USBH_UsrLog("lshift %x",keyboard_info->lshift);
    //                USBH_UsrLog("lalt %x",keyboard_info->lalt);
    //                USBH_UsrLog("lgui %x",keyboard_info->lgui);
    //                USBH_UsrLog("rctrl %x",keyboard_info->rctrl);
    //                USBH_UsrLog("rshift %x",keyboard_info->rshift);
    //                USBH_UsrLog("rgui %x",keyboard_info->rgui);
                    
                    USBH_UsrLog("keys[6] %x %x %x %x %x %x ",keyboard_info->keys[0],
                                                             keyboard_info->keys[1],
                                                             keyboard_info->keys[2],
                                                             keyboard_info->keys[3],
                                                             keyboard_info->keys[4],
                                                             keyboard_info->keys[5]);
                    
                    if(keyboard_info->keys[0] == 0x39)
                    {
                        led_flag=~led_flag;
                        if(led_flag)
                        {
                            reportBuff[0] = 0X02;
                            status = USBH_HID_SetReport (phost,2,0,reportBuff,1);
                            USBH_UsrLog("USBH_HID_SetReport %02x  reportBuff %02x  ",status,reportBuff[0]); 
                        }
                        else
                        {
                            reportBuff[0] = 0X00;
                            status = USBH_HID_SetReport (phost,2,0,reportBuff,1);
                            USBH_UsrLog("USBH_HID_SetReport %02x  reportBuff %02x  ",status,reportBuff[0]); 
    
                        }
    
                    }
                    
                }
                
    
    
    
           }     
           break;
           
           case HID_MOUSE:
           {  
               HID_MOUSE_Info_TypeDef *mouse_info;
               
               mouse_info = USBH_HID_GetMouseInfo(phost);
               USBH_UsrLog("mouse_info X%d, Y%d ,button %d %d %d",mouse_info->x,mouse_info->y,mouse_info->buttons[2],mouse_info->buttons[1],mouse_info->buttons[0]);
           }
           break;
           
           default:
           break;
       }
    }
    /* USER CODE END 1 */
    View Code

    观察log,只有当USBH_HID_SetReport的返回值为  USBH_OK   = 0,时候我们才能看到灯的变化。

     那我们继续修改代码

    /* USER CODE BEGIN 1 */
    void USBH_HID_EventCallback(USBH_HandleTypeDef *phost)
    {
        HID_TypeTypeDef   type = HID_UNKNOWN;
    
        USBH_ErrLog("USBH_HID_EventCallback");
    
        type = USBH_HID_GetDeviceType(phost);
    
        switch(type)
        {
        case HID_KEYBOARD:
        {
            HID_KEYBD_Info_TypeDef *keyboard_info;
            char ascii;
            uint8_t reportBuff[1];
            USBH_StatusTypeDef status         = USBH_BUSY;
            static uint8_t led_flag =0;
    
            keyboard_info = USBH_HID_GetKeybdInfo(phost);
    
            if( keyboard_info != NULL )
            {
                ascii = USBH_HID_GetASCIICode(keyboard_info);
                if( ascii != 0 )
                {
                    USBH_UsrLog("%c",ascii);
                }
    
    //                USBH_UsrLog("state %x",keyboard_info->state);
    //                USBH_UsrLog("lctrl %x",keyboard_info->lctrl);
    //                USBH_UsrLog("lshift %x",keyboard_info->lshift);
    //                USBH_UsrLog("lalt %x",keyboard_info->lalt);
    //                USBH_UsrLog("lgui %x",keyboard_info->lgui);
    //                USBH_UsrLog("rctrl %x",keyboard_info->rctrl);
    //                USBH_UsrLog("rshift %x",keyboard_info->rshift);
    //                USBH_UsrLog("rgui %x",keyboard_info->rgui);
    
                USBH_UsrLog("keys[6] %x %x %x %x %x %x ",keyboard_info->keys[0],
                            keyboard_info->keys[1],
                            keyboard_info->keys[2],
                            keyboard_info->keys[3],
                            keyboard_info->keys[4],
                            keyboard_info->keys[5]);
    
                if(keyboard_info->keys[0] == 0x39)
                {
                    led_flag=~led_flag;
                    if(led_flag)
                    {
                        reportBuff[0] = 0X02;
                        do
                        {
                            status = USBH_HID_SetReport (phost,2,0,reportBuff,1);
                        }
                        while(status !=USBH_OK);
    
                        USBH_UsrLog("USBH_HID_SetReport %02x  reportBuff %02x  ",status,reportBuff[0]);
                    }
                    else
                    {
                        reportBuff[0] = 0X00;
                        do
                        {
                            status = USBH_HID_SetReport (phost,2,0,reportBuff,1);
                        }
                        while(status !=USBH_OK);
                        USBH_UsrLog("USBH_HID_SetReport %02x  reportBuff %02x  ",status,reportBuff[0]);
    
                    }
    
                }
    
            }
        }
        break;
    
        case HID_MOUSE:
        {
            HID_MOUSE_Info_TypeDef *mouse_info;
    
            mouse_info = USBH_HID_GetMouseInfo(phost);
            USBH_UsrLog("mouse_info X%d, Y%d ,button %d %d %d",mouse_info->x,mouse_info->y,mouse_info->buttons[2],mouse_info->buttons[1],mouse_info->buttons[0]);
        }
        break;
    
        default:
            break;
        }
    }
    /* USER CODE END 1 */

    好了我们继续测试发现我们按一下CAPS_LOCK后CAPS_LOCK指示灯能进行翻转。

  • 相关阅读:
    jmeter的插件安装
    linux下性能监控工具nmon的使用
    kafka如何保证不重复消费又不丢失数据_Kafka写入的数据如何保证不丢失?
    Goroutine和Panic
    go 并发有趣现象和要避开的坑
    Go语言宕机恢复(recover)——防止程序崩溃
    invalid character 'è' looking for beginning of value
    golang实现RPC的几种方式
    channl与select
    我要在栈上。不,你应该在堆上
  • 原文地址:https://www.cnblogs.com/libra13179/p/7373217.html
Copyright © 2011-2022 走看看