完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
初学USB,请大家支持下! 采用STM32Cube生成STM32F103VBT6的MDK程序, 使用如下库函数 USBD_HID_SendReport(&hU***DeviceFS,sendbuffer,20); 发送20个字节的数据,在USB抓到的数据可以看到,分成5次发送了??? 难道不能一次发送完成 吗?? 请大神帮忙解惑下!!! 看红色部分即可 按键盘“a”键的数据明显是一次发送8个字节 代码如下: /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "stm32f1xx_hal.h" #include "cmsis_os.h" #include "u***_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(&hU***DeviceFS,sendbuffer,20); //此处发送20字节数据到PC机 osDelay(100); } } } |
|
相关推荐
12个回答
|
|
在配置描述符和报告描述符里把单包最大字节数改成64,如果单包用不到64byte,改成你要发送的数据长度也行。
|
|
|
|
|
|
|
|
|
|
|
|
漂亮 |
|
|
|
|
|
|
|
将配置描述符USB_HID_CONFIG_DESC_SIZ 改为0x08 仍不行 另外报告描述符是改下面这里的数据吗? |
|
|
|
不对。 你要改的是USBD_HID_ConfigDesc 里面End point的 wMaxPacketSize 值。
同时,要让操作系统能够理解你的这个20字节Report,HID Report Descriptor里面的HID REPORT SIZE也需要改成20字节。 |
|
|
|
|
|
1、USBD_HID_ConfigDesc 里面End point的 wMaxPacketSize 值已由0x04改0x08,此值前期改过不管用,可能是只改这一处的原因。
2、Report,HID Report Descriptor里面的HID REPORT SIZE也需要改成20字节。 这条不知怎么下手,试改了几处仍不行,如改过HID_MOUSE_REPORT_DESC_SIZE,值由74改为78,但仍不行 |
|
|
|
坐等大神答疑
|
|
|
|
lizacc 发表于 2018-12-29 22:12 HID_EPIN_SIZE 改了没有?不然描述符里虽然说 wMaxPacketSize 是0x8, 但是你的设备因为USB 驱动配置原因自己发不出去 0x8个字节 另外,我说的HID REPORT SIZE 不是 HID_MOUSE_REPORT_DESC_SIZE, 这个可能给你搞糊涂了。HID_MOUSE_REPORT_DESC_SIZE 是 USB HID 描述符本身的大小 (见HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE])。 在这个 USB HID 描述符里面会告诉操作系统这个设备的HID REPORT是多少字节,如何去处理,等等细节。你学习下USB HID规范就了解了。HID_MOUSE_ReportDesc这个array里面奥妙很多的。 具体请看 https://notes.iopush.net/stm32-custom-u***-hid-step-by-step-2/ 和 https://damogranlabs.com/2016/03 ... -device-yes-please/ |
|
|
|
60user182 发表于 2018-12-29 22:28 非常感谢,回答的很详细,这二天工作又忙 了,等空了再研究下。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
316 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
834 浏览 2 评论
1996 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1099 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1525 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 08:31 , Processed in 0.832106 second(s), Total 65, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号