USB传输类型:控制传输、批量传输、中断传输、同步传输

USB协议里定义了四种传输类型。很多初学者刚接触时容易混淆,觉得不就是发数据吗,搞这么复杂干嘛?

其实每种传输类型都有它特定的应用场景。我刚开始做USB驱动时,就因为选错了传输类型,导致设备在高速模式下频繁丢包。后来才明白,这四种类型就像四种不同的快递服务——有的要保证送到,有的要实时送达,有的量大优先,有的丢了也无所谓。

四种传输类型速览

先看一张总览表,把四种类型的关键差异说清楚:

传输类型 保证送达 保证带宽 实时性 典型应用
控制传输 ✅ 是 否 低 枚举、配置、命令
批量传输 ✅ 是 否 低 U盘、打印机数据
中断传输 ✅ 是 ✅ 是 中 鼠标、键盘、HID
同步传输 ❌ 否 ✅ 是 高 音频、视频、摄像头

这张表我建议你记牢。面试时经常被问到,项目选型时也靠它。

控制传输——USB的"控制通道"

控制传输是所有USB设备都必须支持的。它负责设备枚举、获取描述符、设置配置等底层操作。

核心特点:

  • 双向传输,主机发起,设备响应
  • 有固定的传输阶段:Setup → Data(可选) → Status
  • USB协议保证数据完整送达,出错会重试
  • 带宽占用小,优先级较高

控制传输的流程是这样的:

主机发送Setup令牌包 → 设备接收请求
         ↓
    [可选] 数据阶段(IN或OUT)
         ↓
    状态阶段(握手确认)

我个人习惯把控制传输看作USB设备的"神经系统"。设备刚插上时,主机就是靠控制传输来"盘问"设备的——你是谁?你是什么类型?你需要多少电?

关键点:每个USB设备必须实现端点0,且端点0只支持控制传输。这是USB规范强制要求的。

批量传输——可靠但没准头

批量传输的特点是:数据必须完整送达,但什么时候送到,主机说了算。

应用场景:

  • U盘读写
  • 打印机数据传输
  • 扫描仪图像传输
  • 大文件传输

批量传输没有带宽保证。如果总线上有其他实时传输(比如同步传输),批量传输就得往后排。但一旦开始传输,硬件层面会做CRC校验和重试,保证数据不出错。

我的经验:做U盘项目时,批量传输的缓冲区大小设置很关键。我建议至少分配两个512字节的缓冲区做乒乓操作,否则连续读写时性能会掉得很厉害。

中断传输——准时但不紧急

这个名字容易让人误解。中断传输并不是硬件中断,而是主机定期轮询设备,看有没有数据要传。

核心参数:

  • 轮询间隔:主机每隔N毫秒查询一次设备
  • 最大数据包:每次传输的数据量上限
  • 保证带宽:主机为中断传输预留了时间片

典型应用:

  • 鼠标(轮询间隔通常8ms)
  • 键盘(轮询间隔通常8ms)
  • 游戏手柄
  • HID类设备

中断传输的延迟是可预测的。比如你设置轮询间隔为4ms,那么主机最晚4ms就会来取一次数据。这对人机交互设备来说足够了。

避坑指南:我曾经把鼠标的轮询间隔设成了1ms,结果在USB 1.1全速模式下,主机根本调度不过来,鼠标反而变得卡顿。后来改成4ms就正常了。别盲目追求短间隔,要考虑总线负载。

同步传输——快但不靠谱

同步传输是四种类型里最"任性"的。它追求实时性,但不保证数据完整。

特点:

  • 固定带宽,主机预留时间片
  • 无重传机制,数据丢了就丢了
  • 无握手阶段,只管发不管收
  • 延迟最低,适合流式数据

应用场景:

  • USB音频设备(音箱、麦克风)
  • USB摄像头
  • 视频采集卡
  • 实时数据采集

你想想看,听音乐时偶尔丢一个采样点,人耳根本听不出来。但如果为了重传那个采样点导致音频卡顿,那体验就太差了。同步传输就是基于这个思路设计的。

四种传输类型的对比总结

下面这张SVG图把四种传输类型的关系和选择逻辑画清楚了:

USB四种传输类型对比图 USB四种传输类型选择逻辑 USB传输类型 控制传输 端点0 · 枚举 · 配置 批量传输 U盘 · 打印机 · 大文件 中断传输 鼠标 · 键盘 · HID 同步传输 音频 · 视频 · 摄像头 关键属性对比: 控制/批量/中断 → 保证送达 中断/同步 → 保证带宽 同步 → 不保证送达 选型建议: • 需要可靠传输 + 数据量小 → 控制传输 • 需要可靠传输 + 数据量大 → 批量传输 • 需要实时响应 + 数据量小 → 中断传输 • 需要实时传输 + 可容忍丢包 → 同步传输 • 不确定选哪个 → 先选控制传输

实际项目中的选型建议

做项目时怎么选?我总结了几条经验:

  1. 枚举阶段只能用控制传输——这是USB规范强制的,没得选
  2. HID设备用中断传输——鼠标键盘这类,中断传输最合适
  3. 存储设备用批量传输——U盘、硬盘,数据量大且不能丢
  4. 音视频用同步传输——实时性优先,偶尔丢一帧没关系
  5. 自定义设备看需求——如果数据量小且重要,用控制传输;如果数据量大,用批量传输

小技巧:调试时可以用控制传输做自定义命令。我在项目中经常在控制传输里加一些调试指令,比如读取固件版本、切换测试模式。这样不用额外占用端点资源。

常见误区

最后说几个我踩过的坑:

  • 误区一:以为中断传输是硬件中断。其实它是主机轮询,不是设备主动通知。
  • 误区二:在同步传输里期望数据完整。同步传输不保证送达,丢了就是丢了。
  • 误区三:批量传输的带宽是固定的。实际上批量传输没有带宽保证,总线忙时会被推迟。
  • 误区四:控制传输只能传小数据。虽然控制传输最大包长只有64字节(高速模式),但可以通过多次传输传大块数据。