STM32
直播中

douyin8

12年用户 1070经验值
私信 关注
[问答]

STM32F103RCT6)USB HID键盘调试,接收到串口中断后,往PC机上发送数据失败的原因?

我在开发板上写了个USB HID键盘的测试程序,功能是从USART1接收到数据后,从USB发送到PC机。代码是基于USB-JoyStickMouse修改的。
现在遇到的问题是,拨动摇杆四个方向键,可以往PC上发送字符。但是接收到串口中断后,往PC机上发送数据失败,用Bus Hound软件监视的话,可以看到USB发过来的是全零的数据。

  while (1)
  {
    if (bDeviceState == CONFIGURED)
    {
      if (JoyState() != 0)     
      {
        Joystick_Send(JoyState());  //发送一个字符到PC
        //Delay(100);
        Joystick_Send(0);  //停止发送
       //按键发送OK,PC机能收到字符
      }
    }
#if 1
    if (get_rx_data)
    {
      Joystick_Send(LEFT);  //发送一个字符到PC
      //Delay(100);
      Joystick_Send(0);  //停止发送  //如果注释掉这句话,PC机上可以收到数据,相当于一个按键被长按住的效果,不注释掉的话PC上收不到字符
      rx_counter = 0;
      get_rx_data = FALSE;
    }
#endif
  }

回帖(1)

youyoulan

2024-5-13 18:07:32
从您的描述来看,您在STM32F103RCT6开发板上编写了一个USB HID键盘测试程序,该程序的功能是接收USART1的数据,然后通过USB发送到PC机。您提到拨动摇杆四个方向键可以正常发送字符到PC,但是当接收到串口中断后,往PC机上发送数据失败,且Bus Hound软件显示接收到的数据为全零。

为了解决这个问题,我们可以按照以下步骤进行排查:

1. 确保USART1配置正确:首先检查USART1的配置是否正确,包括波特率、数据位、停止位和奇偶校验位等参数。确保这些参数与发送端的串口配置相匹配。

2. 检查串口中断处理函数:确认串口中断处理函数(如USART1_IRQHandler)是否正确实现了数据接收和存储。确保在接收到数据后,将其存储在适当的缓冲区中,以便后续通过USB发送。

3. 检查USB HID键盘数据发送函数:检查负责将数据从USART1发送到PC的USB HID键盘数据发送函数。确保该函数能够正确地从缓冲区读取数据,并将其封装成USB HID报告,然后通过USB发送。

4. 检查USB HID报告结构:确认USB HID报告的结构是否正确,特别是与键盘相关的字段。确保报告中的键盘数据字段能够正确地反映从USART1接收到的数据。

5. 检查USB HID驱动:确认PC上的USB HID驱动是否正常工作,能够正确解析从STM32F103RCT6发送的USB HID报告。如果可能,尝试在不同的PC上测试,以排除驱动问题。

6. 使用调试工具:使用STM32的调试工具(如ST-LINK)进行调试,逐步跟踪程序的执行过程,找出可能导致问题的地方。

7. 检查代码逻辑:仔细检查代码逻辑,确保在接收到串口中断后,程序能够正确地处理数据并发送到PC。

通过以上步骤,您应该能够找到导致发送数据失败的原因,并进行相应的修复。如果问题仍然存在,建议您查阅相关文档和示例代码,或者寻求社区和论坛的帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分