ESP32S3 USB CDC TinyUsb TX卡死
Posted: Mon Feb 26, 2024 10:30 am
问题描述:
我使用tinyusb_cdcacm_write_queue()函数发送数据,每150ms调用一次,每次发送10256个数据。
一开始能正常发送,大概5分钟之后,tinyusb_cdcacm_write_queue()无法再发送数据,一直返回0。但电脑端发送过来的数据还能正常接收。跳转进入函数内部,发现const uint32_t size_available = tud_cdc_n_write_available(itf);//Get remaining space in FIFO.(获取FIFO中的剩余空间。)
的结果一直为0。
我尝试在tinyusb_cdcacm_write_queue()后增加 tinyusb_cdcacm_write_flush(acm_cfg.cdc_port, 0); 这句代码也没用
尝试使用tud_cdc_n_write_clear()函数清空FIFO内存再发送,也无法解决问题。
发送函数的代码如下:
请问这个问题可能的原因是什么?我该从哪里进行排查和解决?或者怎么才能在不重启的情况下,让TX功能恢复过来?
我使用tinyusb_cdcacm_write_queue()函数发送数据,每150ms调用一次,每次发送10256个数据。
一开始能正常发送,大概5分钟之后,tinyusb_cdcacm_write_queue()无法再发送数据,一直返回0。但电脑端发送过来的数据还能正常接收。跳转进入函数内部,发现const uint32_t size_available = tud_cdc_n_write_available(itf);//Get remaining space in FIFO.(获取FIFO中的剩余空间。)
的结果一直为0。
我尝试在tinyusb_cdcacm_write_queue()后增加 tinyusb_cdcacm_write_flush(acm_cfg.cdc_port, 0); 这句代码也没用
尝试使用tud_cdc_n_write_clear()函数清空FIFO内存再发送,也无法解决问题。
发送函数的代码如下:
Code: Select all
void usb_usart_write(uint8_t* buf, size_t size)
{
TickType_t t = xTaskGetTickCount();//单位10ms
/* write back */
for (size_t i = 0; i < size;) {
size_t sendbytes = size - i;
if (sendbytes > 64)
sendbytes = 64;
size_t wbytes = tinyusb_cdcacm_write_queue(acm_cfg.cdc_port, buf + i, sendbytes);
tinyusb_cdcacm_write_flush(acm_cfg.cdc_port, 0);
if (wbytes == 0) {
TickType_t def = xTaskGetTickCount() - t;
if (def > 1) // 超时退出
{
ESP_LOGW(TAG, "usb_usart_write-> def:%ld break", def);
break;
}
} else {
t = xTaskGetTickCount();
i += wbytes;
}
}
}