使用STM32 CUBE 生成usb hid通信遇到一个奇怪问题 感觉像内存分配问题,单又觉得不是,望高手解惑! 程序情况: 1.单片机STM32L452 2.操作系统FreeRTOS 3.任务数量1,其它任务屏蔽了的 4.通信情况,使用过USB助手发送数据,程序收到后,通过串口打印出数据,同时将数据发送到USB助手。 第一种正常情况: void App_LoraLoginTask(void const * argument) { uint16_t length; uint8_t buff[128]; USB_BUFF *USB_Buff; for(;;) { if( UsbBuff.Queuex != 0 ) { if( xQueueReceive( UsbBuff.Queuex, &USB_Buff, 0 ) == pdPASS ) { if( length = Get_bytes_count( &USB_Buff->R_RingBuff ) ) { length = Read_ring_buffer( &USB_Buff->R_RingBuff, buff, length ); Write_ring_buffer( &USB_Buff->T_RingBuff, buff, length ); USB_SendBuff( USB_Buff ); } } } osDelay(1); } } void USB_SendBuff( USB_BUFF *usb_f ) { static uint8_t sbuff[64] = { USB_CMD, 62 }; uint16_t length = 62; length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff[2], length ); sbuff[1] = length; while( USBD_CUSTOM_HID_SendReport( &hUsbDeviceFS, sbuff, 64 ) == USBD_OK ); Bsp_UsartxIntSendBuff(&UartBuffTbl[ UART_1 ], sbuff, 64 ); } USB助手发送数据 串口能正常收到数据,USB也能收到发出的数据, 2第二种情况,去掉USB_SendBuff里的static ,如下: void USB_SendBuff( USB_BUFF *usb_f ) { uint8_t sbuff[64] = { USB_CMD, 62 }; uint16_t length = 62; length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff[2], length ); sbuff[1] = length; while( USBD_CUSTOM_HID_SendReport( &hUsbDeviceFS, sbuff, 64 ) == USBD_OK ); Bsp_UsartxIntSendBuff(&UartBuffTbl[ UART_1 ], sbuff, 64 ); } 串口还是能正常收,USB收到数据错误,发送不变的情况下,USB收到恒定的错误值 但是sbuff[0] sbuff[1]数据却正常。 函数说明 App_LoraLoginTask 任务主函数,堆栈1024字节, USB_SendBuff 子函数,被主函数调用 USBD_CUSTOM_HID_SendReport USB 发送函数 Bsp_UsartxIntSendBuff 串口发送函数 开始怀疑过任务堆栈,加大到4096问题一样,排除了堆栈问题, 加上static问题解决,感觉是动态分配出了问题,但是串口发送函数仍然没问题。 但是加上static后 连续循环发送两包数据,出现第一包数据掉包现象 void USB_SendBuff( USB_BUFF *usb_f ) { static uint8_t sbuff[64] = { USB_CMD, 62 }; uint16_t length = 62; while( length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff[2], length ) ) { // length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff[2], length ); sbuff[1] = length; while( USBD_CUSTOM_HID_SendReport( &hUsbDeviceFS, sbuff, 64 ) == USBD_OK ); Bsp_UsartxIntSendBuff(&UartBuffTbl[ UART_1 ], sbuff, 64 ); } } while循环两次,第一次发送的数据USB助手未收到,bus hound监控数据 确实是STM32没有发出 |
while( length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff[2], length ) )
你那个发送函数发送数组参数时,只是传递了地址指针,实际发送还没进行。等实际在中断内发送数据时,不加static的数组参数都被改变了,所以数据错误的
评分
查看全部评分
这里没问题的 直接相当于判断的length值
非常感谢,我之前也想过是因为局部变量内存分配被释放导致,所以在发送后加了延时,发现延时10ms也不行,但是我不理解为什么USB发送数据会这么慢,理论是不应该这样的,并且我也是判断了返回状态再发下一帧数据的(sbuff定义为static的情况下)
并且我测试了连续发送两包数据,需要间隔150ms以上才能成功发送 这种情况不对吧
延时没用的啊,你发送只是传递了指针,实际在这个函数中数据还没正式发送呢。
你可以调试跟踪一下。
像这种不是立即发送数据的函数调用,最好用全局变量的数组。
评分
查看全部评分
非常感谢,确实有这种问题,感谢了 大神