硬汉嵌入式论坛

 找回密码
 立即注册
查看: 795|回复: 3
收起左侧

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

[复制链接]

7

主题

10

回帖

31

积分

新手上路

积分
31
发表于 2023-12-4 11:21:20 | 显示全部楼层 |阅读模式
使用树莓派pico的tinyusb传输数据,一帧的大小是28816byte,使用usb发送速率是144KB/s,测试发现在一帧的数据里面会丢几个byte,这是传输过程丢了,还是驱动、代码问题啊?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-12-4 15:09:48 | 显示全部楼层
这速度的话,应该是用的bulk cdc方式? 得看下是底层驱动代码问题,电脑端驱动问题或者上位机处理问题。主要是这三个地方。
回复

使用道具 举报

7

主题

10

回帖

31

积分

新手上路

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

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

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2023-12-5 14:45:20 | 显示全部楼层
如果是cdc bulk方式的查底层驱动,参考实现:
[C] 纯文本查看 复制代码
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循环。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 15:45 , Processed in 0.168423 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表