winddevil 发表于 2022-2-6 14:27:21

[RL-USB-HS-CDC求助]无法连续发送数据

1.建立了一个Thread专门去发送数据,没有使用信号量或者事件组,用的全局变量判断是不是已经满了2.如果已满则调用USBD_CDC_ACM_WriteData发送数据

3.osDelay(1000)以上才可以正常发送数据,系统的Keneral Fre 设置的默认值1000,改变核心的频率比如改到100Hz,就可以Delay(100),可以初步判断是需要较长空闲的时间

4.但是这个osDelay的值很神奇,无论是发送16484个长数据还是发送1024个短数据都需要1000以上
5.如果配置FS的CDC反而不需要Delay
6.猜测:是因为USBD_CDC_ACM_WriteData需要一段时间发送,但是无法判断是否发送完毕,正在查看ARM的文档
7.猜测:是因为我的设置有问题,对于RL-USB了解不足
/*
*********************************************************************************************************
*        函 数 名: CDC1_ACM_UART_to_USB_Thread
*        功能说明: USB发送任务
*        形    参: 无
*        返 回 值: 无
* 优 先 级: osPriorityNormal
*********************************************************************************************************
*/
#ifdef USB_CMSIS_RTOS2
__NO_RETURN static void CDC1_ACM_UART_to_USB_Thread(void *arg)
{
#else
__NO_RETURN void CDC1_ACM_UART_to_USB_Thread(void const *arg)
{
#endif
        (void)(arg);
       
        osStatus_t status;
       
        for (;;)
        {       
                if(usb_send_full==1)
                {
                        usb_send_full=0;
                        USBD_CDC_ACM_WriteData(1U,USBD_HIGHSPEED_CDC_Send_Buf1,USB_SEND_BUFFER_SIZE/2);
                }
                else if(usb_send_full==2)
                {
                        usb_send_full=0;
                        usb_send_cnt=0;
                        USBD_CDC_ACM_WriteData(1U,&USBD_HIGHSPEED_CDC_Send_Buf1,USB_SEND_BUFFER_SIZE/2);
                }
                osDelay(1000U);
        }
}

#ifdef USB_CMSIS_RTOS2
#ifdef USB_CMSIS_RTOS2_RTX5
/*控制块内存*/
static osRtxThread_t cdc1_acm_uart_to_usb_thread_cb_mem __SECTION(.bss.os.thread.cb);
/*栈内存*/
static uint64_t cdc1_acm_uart_to_usb_thread_stack_mem __SECTION(.bss.os.thread.stack);
#endif
/*线程参数设置*/
static const osThreadAttr_t cdc1_acm_uart_to_usb_thread_attr = {
        "CDC1_ACM_USB_Thread",
        0U,
#ifdef USB_CMSIS_RTOS2_RTX5
        &cdc1_acm_uart_to_usb_thread_cb_mem,
        sizeof(osRtxThread_t),
        &cdc1_acm_uart_to_usb_thread_stack_mem,
#else
        NULL,
        0U,
        NULL,
#endif
        512U,
        osPriorityAboveNormal,
        0U,
        0U};
#else
extern const osThreadDef_t os_thread_def_CDC0_ACM_UART_to_USB_Thread;
osThreadDef(CDC0_ACM_UART_to_USB_Thread, osPriorityNormal, 1U, 0U);
#endif



eric2013 发表于 2022-2-6 15:02:32

这个有个虚拟串口的例子,参考下那个回调函数实现,你的MDK安装了STM32F4的软件包就看到了。

winddevil 发表于 2022-2-6 16:15:43

eric2013 发表于 2022-2-6 15:02
这个有个虚拟串口的例子,参考下那个回调函数实现,你的MDK安装了STM32F4的软件包就看到了。

您上次说的也是这个,我是参考他的来的,他的代码里是串口3转我们的虚拟串口嘛,我就是照着他的改的,好像也不行,我再试试

eric2013 发表于 2022-2-8 10:48:55

winddevil 发表于 2022-2-6 16:15
您上次说的也是这个,我是参考他的来的,他的代码里是串口3转我们的虚拟串口嘛,我就是照着他的改的,好 ...
你可以考虑直接把虚拟串口例子跑通了,再修改,这样好点。

ifree 发表于 2024-2-6 18:07:13

不知道楼主还来不来,不知道楼主有没有解决这个问题。我遇到的问题应该和楼主是一样的。

使用RTE创建的CDC,采用的默认配置,利用向导生成的USBD_User_CDC_ACM_UART_0.c代码。(RLUSB从RTE中看到的版本是6.16.1)

// Thread: Sends data received on UART to USB
// \param   arg         not used.
#ifdef USB_CMSIS_RTOS2
__NO_RETURN static void CDC0_ACM_UART_to_USB_Thread (void *arg) {
#else
__NO_RETURN      void CDC0_ACM_UART_to_USB_Thread (void const *arg) {
#endif
int32_t cnt, cnt_to_wrap;

(void)(arg);

for (;;) {
    // UART - > USB
    if (ptrUART->GetStatus().rx_busy != 0U) {
      cnt= uart_rx_cnt;
      cnt += (int32_t)ptrUART->GetRxCount();
      cnt -= usb_tx_cnt;
      if (cnt >= UART_BUFFER_SIZE) {
      // Dump data received on UART if USB is not consuming fast enough
      usb_tx_cnt += cnt;
      cnt = 0U;
      }
      if (cnt > 0) {
      cnt_to_wrap = (int32_t)(UART_BUFFER_SIZE - ((uint32_t)usb_tx_cnt & (UART_BUFFER_SIZE - 1)));
      if (cnt > cnt_to_wrap) {
          cnt = cnt_to_wrap;
      }
      cnt = USBD_CDC_ACM_WriteData(0U, (uart_rx_buf + ((uint32_t)usb_tx_cnt & (UART_BUFFER_SIZE - 1))), cnt);
      if (cnt > 0) {
          usb_tx_cnt += cnt;
      }
      }
    }
    (void)osDelay(10U);
}
}
模板中的代码将UART接收到的数据转发到USB,for(;;)循环中,使用的延时是osDelay(10); 我测试另外用一个串口给这个CDC发数据“1234567890”,定时1ms发送,这个代码可以很好的将UART接收到的数据转发到USB。

然后,我将上面代码,替换成如下精简的代码。
#ifdef USB_CMSIS_RTOS2
__NO_RETURN static void CDC0_ACM_UART_to_USB_Thread (void *arg) {
#else
__NO_RETURN      void CDC0_ACM_UART_to_USB_Thread (void const *arg) {
#endif
int32_t cnt, cnt_to_wrap;


(void)(arg);

        for(int i = 0; i < CDC_BUFFER_SIZE; i++)
        {
                cdc_tx_buf = i;
        }
       
for (;;) {
    // UART - > USB
    USBD_CDC_ACM_WriteData(0U, cdc_tx_buf, 1);
    (void)osDelay(500U);
}
}
每次发送固定的数据,osDelay(500),串口助手可以收到CDC发过来的数据。
osDelay改成400,100,10等值测试,都无法收到数据。
每次发送的数据个数从1到4096都没问题(更大的值没有测试了)。

模板代码没看到什么神奇的地方,为啥模板代码可以用osDelay(10),而我这个简单的代码却必须osDelay(500)以上?
页: [1]
查看完整版本: [RL-USB-HS-CDC求助]无法连续发送数据