高级会员

- 积分
- 588
- 金钱
- 588
- 注册时间
- 2014-10-15
- 在线时间
- 137 小时
|

楼主 |
发表于 2023-6-19 11:52:02
|
显示全部楼层
谢谢!我看了。可是圈圈的书上的写法和STM32不一样。我贴一下圈圈的写法:
- if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据
- {
- //为显示KEY1选择功能,当KEY1按住时,将LED8点亮,表示键盘功能状态
- if(KeyPress & KEY1)
- {
- OnLed8();
- //如果端点1输入没有处于忙状态,则可以发送数据
- if(!Ep1InIsBusy)
- {
- KeyCanChange=0; //禁止按键扫描
- if(KeyUp||KeyDown) //如果有按键事件发生
- {
- SendKeyboardReport(); //则返回报告
- }
- KeyCanChange=1; //允许按键扫描
- }
- }
- else
- {
- OffLed8();
- //如果端点2输入没有处于忙状态,则可以发送数据
- if(!Ep2InIsBusy)
- {
- KeyCanChange=0; //禁止按键扫描
- if(KeyUp||KeyDown) //如果有按键事件发生
- {
- SendMouseReport(); //则返回报告
- }
- KeyCanChange=1; //允许按键扫描
- }
- }
- }
复制代码- /********************************************************************
- 函数功能:根据按键情况返回键盘报告的函数。
- 入口参数:无。
- 返 回:无。
- 备 注:无。
- ********************************************************************/
- void SendKeyboardReport(void)
- {
- //需要返回的9字节报告的缓冲(一字节报告ID加键盘8字节报告)
-
- uint8 Buf[9]={0,0,0,0,0,0,0,0,0};
-
- //由于需要返回多个按键,所以需要增加一个变量来保存当前的位置。
- //由于报告ID占用第一字节,所以普通按键从第四字节开始存放。
- uint8 i=3;
-
- //我们用KEY1键来选择剩余的7个键是键盘功能还是鼠标功能。
- //当KEY1按住时,剩余7个键为键盘功能,这7个键的功能跟键盘
- //实例的一样。
-
- //根据不同的按键设置输入报告
- Buf[0]=0x01; //第一字节为报告ID,报告ID为1。
- if(KeyPress & KEY2) //如果KEY2按住
- {
- Buf[1]|=0x02; //KEY2为左Shift键。
- }
- if(KeyPress & KEY3) //如果KEY3按住
- {
- Buf[1]|=0x04; //KEY3为左Alt键
- }
- if(KeyPress & KEY4) //如果KEY4按住
- {
- Buf[i]=0x59; //KEY4为数字小键盘1键。
- i++; //切换到下个位置。
- }
- if(KeyPress & KEY5) //如果KEY5按住
- {
- Buf[i]=0x5A; //KEY5数字小键盘2键。
- i++; //切换到下个位置。
- }
- if(KeyPress & KEY6) //如果KEY6按住
- {
- Buf[i]=0x5B; //KEY6为数字小键盘3键。
- i++; //切换到下个位置。
- }
- if(KeyPress & KEY7) //如果KEY7按住
- {
- Buf[i]=0x39; //KEY7为大/小写切换键。
- i++; //切换到下个位置。
- }
- if(KeyPress & KEY8) //如果KEY8按住
- {
- Buf[i]=0x53; //KEY8为数字小键盘功能切换键。
- }
- //报告准备好了,通过端点1返回,长度为9字节。
- D12WriteEndpointBuffer(3,9,Buf);
- Ep1InIsBusy=1; //设置端点1输入忙标志。
- //记得清除KeyUp和KeyDown
- KeyUp=0;
- KeyDown=0;
- }
- ////////////////////////End of function//////////////////////////////
- /********************************************************************
- 函数功能:根据按键情况返回鼠标报告的函数。
- 入口参数:无。
- 返 回:无。
- 备 注:无。
- ********************************************************************/
- void SendMouseReport(void)
- {
- //需要返回的5字节报告的缓冲(一字节报告ID加键盘4字节报告)
-
- uint8 Buf[5]={0,0,0,0,0};
-
- //当KEY1松开时,剩余7个键为鼠标功能,功能分别为:
- //KEY2:光标左移,KEY3:光标右移,KEY4:光标上移,KEY5:光标下移。
- //KEY6:鼠标左键,KEY7:鼠标中键,KEY8:鼠标右键。
-
- //根据不同的按键设置输入报告。注意此处,报告ID要跟报告描述符中的一致。
- Buf[0]=0x01; //第一字节为报告ID,报告ID为1。
- if(KeyDown & KEY2) //如果KEY2按下
- {
- Buf[2]=-10; //KEY2为鼠标左移,按一次移动10个单位。
- }
- if(KeyDown & KEY3) //如果KEY3按下
- {
- Buf[2]=10; //KEY3为鼠标右移,按一次移动10个单位。
- }
- if(KeyDown & KEY4) //如果KEY4按下
- {
- Buf[3]=-10; //KEY4为鼠标上移,按一次移动10个单位。
- }
- if(KeyDown & KEY5) //如果KEY5按下
- {
- Buf[3]=10; //KEY5为鼠标下移,按一次移动10个单位。
- }
- if(KeyPress & KEY6) //如果KEY6按住
- {
- Buf[1]|=0x01; //KEY6为鼠标左键。
- }
- if(KeyPress & KEY7) //如果KEY7按住
- {
- Buf[1]|=0x04; //KEY7为鼠标中键。
- }
- if(KeyPress & KEY8) //如果KEY8按住
- {
- Buf[1]|=0x02; //KEY8为鼠标右键。
- }
- //注意此处,要通过端点2返回。
- //报告准备好了,通过端点2返回,长度为5字节。
- D12WriteEndpointBuffer(5,5,Buf);
- Ep2InIsBusy=1; //设置端点2输入忙标志。
- //记得清除KeyUp和KeyDown
- KeyUp=0;
- KeyDown=0;
- }
复制代码 发送键盘的函数是D12WriteEndpointBuffer(3,9,Buf);
发送鼠标的函数是D12WriteEndpointBuffer(5,5,Buf);
可是STM32程序
发送报告是这样写的
USBD_HID_SendReport(&hUsbDeviceFS,sendbuffer,9);//发送报文
hUsbDeviceFS是这样定义的,USBD_HandleTypeDef hUsbDeviceFS;
我找遍了整个工程也没见怎么给它赋值。
况且带鼠标功能的USB键盘(方法一)我已经做成功了。
这个问题看描述符能解决吗?而且是鼠标和键盘都不反应,
我实在是想不到该怎么解决了。你能不能给我提个醒啊?谢谢
|
|