chaung11 发表于 2023-12-4 11:21:20

rp2040使用tiny_usb传输大量数据会导致丢数据的现象

使用树莓派pico的tinyusb传输数据,一帧的大小是28816byte,使用usb发送速率是144KB/s,测试发现在一帧的数据里面会丢几个byte,这是传输过程丢了,还是驱动、代码问题啊?

eric2013 发表于 2023-12-4 15:09:48

这速度的话,应该是用的bulk cdc方式? 得看下是底层驱动代码问题,电脑端驱动问题或者上位机处理问题。主要是这三个地方。

chaung11 发表于 2023-12-4 16:48:58

eric2013 发表于 2023-12-4 15:09
这速度的话,应该是用的bulk cdc方式? 得看下是底层驱动代码问题,电脑端驱动问题或者上位机处理问题。主 ...

我也试过用自己写的测试数据,循环发送,速度可以到700K,也没有发现丢失数据。数据是通过SPI采集的雷达数据,因为雷达的配置比较高,一帧有28.8K的数据。我去看看usb的驱动代码

cking616 发表于 2023-12-5 14:45:20

如果是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]
查看完整版本: rp2040使用tiny_usb传输大量数据会导致丢数据的现象