不知道楼主还来不来,不知道楼主有没有解决这个问题。我遇到的问题应该和楼主是一样的。
使用RTE创建的CDC,采用的默认配置,利用向导生成的USBD_User_CDC_ACM_UART_0.c代码。(RLUSB从RTE中看到的版本是6.16.1)
[C] 纯文本查看 复制代码 // Thread: Sends data received on UART to USB
// \param[in] 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。
然后,我将上面代码,替换成如下精简的代码。
[C] 纯文本查看 复制代码 #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] = 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)以上?
|