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

 找回密码
 我要注册
搜索
热搜: USB学习板
查看: 4305|回复: 3

按一下键却有长按的效果

[复制链接]

1

主题

0

好友

15

积分

新手上路

Rank: 1

发表于 2014-8-10 18:21:48 |显示全部楼层
下面是我的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抓取的截图如下

15.1 IN的数据是由我上面的函数产生的,还有个15.0应该是控制端点0.18 IN的数据不知道是啥?
希望有人提示下18 IN数据怎么产生的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?我要注册

回复

使用道具 举报

1

主题

0

好友

15

积分

新手上路

Rank: 1

发表于 2014-8-10 18:26:00 |显示全部楼层
前面的数据也发一下,这里是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   
回复

使用道具 举报

6

主题

0

好友

1154

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2014-8-11 17:30:12 |显示全部楼层
发送一次按键按下报告包后,还应该再向主机发送一次此按键弹起的报告包,否则主机认为此键长按。你抓取的数据发现有不断向主机发送两个字节的数据包(全为零),这应该是固件程序的问题。
回复

使用道具 举报

1

主题

0

好友

15

积分

新手上路

Rank: 1

发表于 2014-8-16 11:07:13 |显示全部楼层
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开发网 (渝ICP备09006681号-4)

GMT+8, 2024-3-28 17:56 , Processed in 0.073618 second(s), 26 queries .

百合电子工作室版权所有
回顶部