USB论坛-百合电子工作室USB专题站

标题: 按一下键却有长按的效果 [打印本页]

作者: yucejun    时间: 2014-8-10 18:21
标题: 按一下键却有长按的效果
下面是我的STM32 USB HID键盘,发送键值的函数。测试发现,按一下键,会在电脑产生长按的效果。
#define SEND_BUF_SIZE                10
#define SEND_BUF_SIZE_ONLY_UP_DOWN                2

void hid_key_send(unsigned char key)
{
        memset (Send_Buffer, 0, SEND_BUF_SIZE);
        Send_Buffer[0] = key;
        Send_Buffer[1] = 0;
        if (EP_TX_NAK == GetEPTxStatus(ENDP1))
        {
                UserToPMABufferCopy(Send_Buffer, GetEPTxAddr(ENDP1), SEND_BUF_SIZE_ONLY_UP_DOWN);
                SetEPTxCount(ENDP1, SEND_BUF_SIZE_ONLY_UP_DOWN);
                SetEPTxValid(ENDP1);
        }
}

用husbound抓取的截图如下
[attach]18[/attach]
15.1 IN的数据是由我上面的函数产生的,还有个15.0应该是控制端点0.18 IN的数据不知道是啥?
希望有人提示下18 IN数据怎么产生的

作者: yucejun    时间: 2014-8-10 18:26
前面的数据也发一下,这里是17.0,因为不是一次抓的数据
Device  Phase  Data                      Description       Cmd.Phase.Ofs(rep)
------  -----  ------------------------  ----------------  ------------------
  17.0  CTL    80 06 00 01  00 00 12 00  GET DESCRIPTOR           1.1.0      
  17.0  IN     12 01 00 02  00 00 00 40  .......@                 1.2.0        
               83 04 50 57  00 02 01 02  ..PW....                 1.2.8        
               03 01                     ..                       1.2.16      
  17.0  CTL    80 06 00 02  00 00 09 00  GET DESCRIPTOR           2.1.0        
  17.0  IN     09 02 29 00  01 01 00 80  ..).....                 2.2.0        
               c8                        .                        2.2.8        
  17.0  CTL    80 06 00 02  00 00 29 00  GET DESCRIPTOR           3.1.0        
  17.0  IN     09 02 29 00  01 01 00 80  ..).....                 3.2.0        
               c8 09 04 00  00 02 03 01  ........                 3.2.8        
               01 00 09 21  10 01 00 01  ...!....                 3.2.16      
               22 18 00 07  05 81 03 40  "......@                 3.2.24      
               00 20 07 05  01 03 40 00  . ....@.                 3.2.32      
               20                                                 3.2.40      
  17.0  CTL    00 09 01 00  00 00 00 00  SET CONFIG               4.1.0        
  17.0  CTL    21 0a 00 00  00 00 00 00  SET IDLE                 5.1.0        
  17.0  USTS   c0000004                  stall pid                5.2.0        
  17.0  CTL    81 06 00 22  00 00 58 00  GET DESCRIPTOR           6.1.0        
  17.0  IN     05 01 09 06  a1 01 05 07  ........                 6.2.0        
               19 00 29 ff  15 00 26 ff  ..)...&.                 6.2.8        
               00 75 08 95  02 81 00 c0  .u......                 6.2.16   
作者: baiheee    时间: 2014-8-11 17:30
发送一次按键按下报告包后,还应该再向主机发送一次此按键弹起的报告包,否则主机认为此键长按。你抓取的数据发现有不断向主机发送两个字节的数据包(全为零),这应该是固件程序的问题。
作者: yucejun    时间: 2014-8-16 11:07
baiheee 发表于 2014-8-11 17:30
发送一次按键按下报告包后,还应该再向主机发送一次此按键弹起的报告包,否则主机认为此键长按。你抓取的数 ...

问题已解决,正是baiheee说的问题。谢谢啦!
我在其他几个地方调用了hid_key_send发送00 00,导致00 00多次发送。
我现在修改了,将00 00就放在hid_key_send里面完成。修改后如下
void hid_key_send2(unsigned char key)
{
        memset (Send_Buffer, 0, SEND_BUF_SIZE);

        Send_Buffer[0] = key;
        Send_Buffer[1] = 0;

        while (EP_TX_NAK != GetEPTxStatus(ENDP1))
                ;

        UserToPMABufferCopy(Send_Buffer, GetEPTxAddr(ENDP1), SEND_BUF_SIZE_ONLY_UP_DOWN);
        SetEPTxCount(ENDP1, SEND_BUF_SIZE_ONLY_UP_DOWN);
        SetEPTxValid(ENDP1);

        Send_Buffer[0] = 0x00;
        while (EP_TX_NAK != GetEPTxStatus(ENDP1))
                ;
       
        UserToPMABufferCopy(Send_Buffer, GetEPTxAddr(ENDP1), SEND_BUF_SIZE_ONLY_UP_DOWN);
        SetEPTxCount(ENDP1, SEND_BUF_SIZE_ONLY_UP_DOWN);
        SetEPTxValid(ENDP1);
}




欢迎光临 USB论坛-百合电子工作室USB专题站 (http://usb.baiheee.com/usb_bbs/) Powered by Discuz! X2.5