[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
这个有个虚拟串口的例子,参考下那个回调函数实现,你的MDK安装了STM32F4的软件包就看到了。 eric2013 发表于 2022-2-6 15:02
这个有个虚拟串口的例子,参考下那个回调函数实现,你的MDK安装了STM32F4的软件包就看到了。
您上次说的也是这个,我是参考他的来的,他的代码里是串口3转我们的虚拟串口嘛,我就是照着他的改的,好像也不行,我再试试 winddevil 发表于 2022-2-6 16:15
您上次说的也是这个,我是参考他的来的,他的代码里是串口3转我们的虚拟串口嘛,我就是照着他的改的,好 ...
你可以考虑直接把虚拟串口例子跑通了,再修改,这样好点。 不知道楼主还来不来,不知道楼主有没有解决这个问题。我遇到的问题应该和楼主是一样的。
使用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]