You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何增大Raspberry Pi 4的USB缓冲区?解决RP2040数据丢失问题

解决树莓派USB接收缓冲区不足的方案

针对RP2040每10毫秒发送2000字节数据、树莓派延迟200ms读取就丢数据的问题,可通过以下步骤增大USB缓冲区:

1. 调整CDC-ACM串口设备缓冲区(RP2040常用模式)

RP2040通常以USB CDC-ACM模拟串口通信,直接调整该设备的收发缓冲区:

临时生效(重启后失效)

在终端执行以下命令(替换/dev/ttyACM0为你的实际设备路径):

# 配置串口基础参数
stty -F /dev/ttyACM0 icanon min 1 time 0
stty -F /dev/ttyACM0 ospeed 115200 ispeed 115200
# 设置缓冲区大小为40KB(刚好覆盖200ms的数据量)
echo 40960 > /sys/class/tty/ttyACM0/device/out_max_size
echo 40960 > /sys/class/tty/ttyACM0/device/in_max_size

可根据需求将40960调整为更大值,比如81920(80KB)。

永久生效

创建udev规则避免重启后参数重置:

  1. 新建规则文件:
    sudo nano /etc/udev/rules.d/99-rp2040-usb.rules
    
  2. 写入以下内容(替换idVendor和idProduct为你的RP2040设备ID,可通过lsusb命令查询):
    SUBSYSTEM=="tty", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000a", RUN+="/bin/sh -c 'echo 40960 > /sys/class/tty/%k/device/out_max_size; echo 40960 > /sys/class/tty/%k/device/in_max_size'"
    
  3. 重新加载udev规则:
    sudo udevadm control --reload-rules && sudo udevadm trigger
    

2. 调整USB内核全局缓冲区

如果是通用USB设备(非CDC-ACM模式),可调整USB子系统的全局缓冲区:

临时生效

# 设置USBFS缓冲区为16MB
echo 16384 > /sys/module/usbcore/parameters/usbfs_memory_mb

最大值可设为65536(64MB),按需调整。

永久生效

  1. 编辑内核模块配置文件:
    sudo nano /etc/modules-load.d/usbcore.conf
    
  2. 添加以下内容:
    options usbcore usbfs_memory_mb=16384
    
  3. 重启系统生效。

3. 应用层读取优化

即使增大缓冲区,优化读取逻辑能进一步避免丢包:

  • 采用非阻塞IO或多线程读取,避免单次等待200ms再读取;
  • 降低读取间隔,比如每10-20ms读取一次,分散缓冲区压力;
  • 提高接收程序优先级,比如用nice -n -10 ./your-receive-app启动,确保程序优先获取CPU资源。

4. 验证缓冲区配置

执行以下命令查看当前缓冲区大小,确认配置生效:

cat /sys/class/tty/ttyACM0/device/in_max_size
cat /sys/class/tty/ttyACM0/device/out_max_size
cat /sys/module/usbcore/parameters/usbfs_memory_mb

内容的提问来源于stack exchange,提问作者Walid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:35:14