打印
[STM32F1]

Cube中USB HID键盘重复发送的问题

[复制链接]
2728|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
reynoldxu|  楼主 | 2015-9-12 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
hi all:
    用Cube工具生成了HID的项目文件,通过修改HID的报文和HID的HID_ReportDesc_FS,现在电脑上能够认出键盘了,并且,通过调用Cube中的HID_SendReport函数发送8个byte的键盘帧格式到电脑上也成功,但是问题来了,发送成功后由于没有及时发送无按键的状态,电脑上就表现为某个按键一直按下的效果,于是我尝试了以下几种解决方案,但是都失败了
1.HID_SendReport后直接发送8个byte全0的report,但是这样上位机同样表现为某个按键一直按下,未成功
2.在USBD_CUSTOM_HID_DataIn中把发送缓冲区中的数据改为0,参考注释这个函数应该是在发送完数据后调用的,但是还是不成功.

所以现在有几点比较不清楚
1.发送HID报文理应是调用HID_SendReport这个函数,但是调用完这个函数发送完报文之后有没有回调让我处理发送区数据?在键盘的应用中就是设置报文全部为0从而发送全0告诉电脑没有按键按下了(或者按键释放了)
2.HID描述中有一个间隔时间,是不是会定时发In包向Device请求HID报文,这样的话,是不是要在USB库中增加相应回调?
沙发
宛豆苗| | 2015-9-17 21:21 | 只看该作者
你好,根据键盘的协议,你不能在后面直接送一个全0的数据过去,你只能改变你之前一个按键的数据为0,你可以参考我们的DEMO发送过程:
  if (keyboardcounter++ >= 100)
    {
      if(TamperButton_State == 1) /* Send data */
      {
        USBD_HID_KEYBOARD_SendReport(&USBD_Device, Keyboard_Buffer, 8);
        TamperButton_State = 2;
      }
      else if(TamperButton_State == 2) /* Send dummy data */
      {
        Keyboard_Buffer[2] = 0;
        USBD_HID_KEYBOARD_SendReport(&USBD_Device, Keyboard_Buffer, 8);
        TamperButton_State = 3;
      }
      keyboardcounter = 0;
    }

时间间隔根据你的实际应用而定,我们的DEMO中,我们用的是100MS .

使用特权

评论回复
板凳
reynoldxu|  楼主 | 2015-10-4 12:39 | 只看该作者
宛豆苗 发表于 2015-9-17 21:21
你好,根据键盘的协议,你不能在后面直接送一个全0的数据过去,你只能改变你之前一个按键的数据为0,你可以 ...

谢谢回复,请问下USBD_HID_KEYBOARD_SendReport这个函数就是cube中的HID_send_report嘛,放假结束后我去尝试下,万分感谢

使用特权

评论回复
地板
想做大牛的小马| | 2015-10-30 11:55 | 只看该作者
无论是hid还是其他class,所有的动作都是由HOST发起的!
释放键是通过发送 全0实现的,host收到后就知道device端释放了按键!
IN端点发送完成的回调函数是有的,可以根据应用在里面添加相应的程序!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝