rp2040使用tiny_usb传输大量数据会导致丢数据的现象
使用树莓派pico的tinyusb传输数据,一帧的大小是28816byte,使用usb发送速率是144KB/s,测试发现在一帧的数据里面会丢几个byte,这是传输过程丢了,还是驱动、代码问题啊?这速度的话,应该是用的bulk cdc方式? 得看下是底层驱动代码问题,电脑端驱动问题或者上位机处理问题。主要是这三个地方。 eric2013 发表于 2023-12-4 15:09
这速度的话,应该是用的bulk cdc方式? 得看下是底层驱动代码问题,电脑端驱动问题或者上位机处理问题。主 ...
我也试过用自己写的测试数据,循环发送,速度可以到700K,也没有发现丢失数据。数据是通过SPI采集的雷达数据,因为雷达的配置比较高,一帧有28.8K的数据。我去看看usb的驱动代码 如果是cdc bulk方式的查底层驱动,参考实现:
void cdc_transfer(unsigned char* data, int len)
{
int left = len;
int pos = 0;
while(left > 0)
{
int avail = (int) tud_cdc_write_available();
if(avail > left)
avail = left;
if(avail)
{
int transferred = (int) tud_cdc_write(data + pos, avail);
tud_task();
tud_cdc_write_flush();
pos += transferred;
left -= transferred;
}
else
{
tud_task();
tud_cdc_write_flush();
if (!tud_cdc_connected())
break;
}
}
}
使用tud_cdc_write之前,需要根据tud_cdc_write_available来判断当前可以写多少字节,如果不判断tud_cdc_write_available字节数就强行使用tud_cdc_write可能会导致fifo溢出表现为丢字节。如果考虑上面的程序while循环,这个cpu占用高效率低,可以自行实现tud_cdc_tx_complete_cb这个回调函数来每次传输64字节的方式进行连续传输取代上面的while循环。
页:
[1]