USBD_HID_SendReport只能发送4个字节

2019-07-14 14:52发布



初学USB,请大家支持下!

采用STM32Cube生成STM32F103VBT6的MDK程序,
使用如下库函数
USBD_HID_SendReport(&hUsbDeviceFS,sendbuffer,20);
发送20个字节的数据,在USB抓到的数据可以看到,分成5次发送了???  难道不能一次发送完成 吗??
请大神帮忙解惑下!!!
看红 {MOD}部分即可

按键盘“a”键的数据明显是一次发送8个字节

代码如下:
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"
#include "cmsis_os.h"
#include "usb_device.h"

osThreadId defaultTaskHandle;
osThreadId RS485_1Handle;

uint8_t uart1_rx_buf[20];
uint8_t uart1_rx_len = 20;
uint8_t uart1_rx_flag = 0;

uint8_t sendbuffer[20]={0x02,0x30,0x31,0x01,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x03};

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void StartDefaultTask(void const * argument);
void RS485_1Task(void const * argument);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
  osThreadDef(RS485_1, RS485_1Task, osPriorityNormal, 0, 128);
  RS485_1Handle = osThreadCreate(osThread(RS485_1), NULL);
  osKernelStart();
  while (1)
  {
  }
}

void RS485_1Task(void const * argument)
{
  for(;;)
  {
      if(uart1_rx_flag)
      {
         HAL_GPIO_WritePin(DR1_GPIO_Port,DR1_Pin, GPIO_PIN_SET);                //使能485_1发送
         osDelay(100);
         HAL_UART_Transmit_IT(&huart1, uart1_rx_buf, uart1_rx_len);               
         osDelay(100);
         HAL_GPIO_WritePin(DR1_GPIO_Port,DR1_Pin, GPIO_PIN_RESET);                //使能485_1接收                        
         uart1_rx_flag = 0;
         osDelay(100);                        

        USBD_HID_SendReport(&hUsbDeviceFS,sendbuffer,20);    //此处发送20字节数据到PC机
        osDelay(100);        
     }
  }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
lizacc
1楼-- · 2019-07-14 22:58
邀杯同醉酒 发表于 1970-1-1 08:00

找了半天,没找到配置描述符,和报告描述符的位置,能否明示下!!
肥肥飞飞
2楼-- · 2019-07-15 02:00
如图,在usb_hid.c文件中

cknz
3楼-- · 2019-07-15 06:38
jufenyi 发表于 2018-12-29 20:32
在配置描述符和报告描述符里把单包最大字节数改成64,如果单包用不到64byte,改成你要发送的数据长度也行。

漂亮
lizacc
4楼-- · 2019-07-15 10:11
 精彩回答 2  元偷偷看……
lizacc
5楼-- · 2019-07-15 11:55
肥肥飞飞 发表于 2018-12-29 21:00
如图,在usb_hid.c文件中

将配置描述符USB_HID_CONFIG_DESC_SIZ 改为0x08  仍不行
另外报告描述符是改下面这里的数据吗?
60user182
6楼-- · 2019-07-15 14:50
不对。 你要改的是USBD_HID_ConfigDesc 里面End point的 wMaxPacketSize 值。
同时,要让操作系统能够理解你的这个20字节Report,HID Report Descriptor里面的HID REPORT SIZE也需要改成20字节。

一周热门 更多>