5、USB批量传输与中断传输:深入理解四种传输方式

大家好,我是你们的老朋友。今天我们来聊聊USB传输中几个核心概念——批量传输、中断传输,顺带把同步传输和控制传输也捋一遍。说实话,我刚接触USB开发那会儿,也被这四种传输方式搞得晕头转向。后来在项目中踩过几次坑,才真正理解了它们各自的脾气。

嗯,咱们先看一张总览图,把这四种传输方式的关系理清楚。

USB四种传输方式总览 控制传输 (Control Transfer) 基础配置与枚举 双向、可靠、带宽有保证 每个USB设备必须支持 端点0专用 批量传输 (Bulk Transfer) 大数据量、可靠传输 非实时、带宽动态分配 U盘、打印机、数据采集 错误重传保证完整性 中断传输 (Interrupt Transfer) 小数据量、周期性查询 保证最大延迟时间 鼠标、键盘、游戏手柄 不是真正的中断,是轮询 同步传输 (Isochronous Transfer) 实时、恒定速率 无错误重传机制 音频、视频、摄像头 允许少量丢包

5.1 批量传输(Bulk Transfer)—— 可靠的数据搬运工

批量传输,说白了就是USB协议里的"老黄牛"。它不要求实时性,但必须保证数据100%正确到达。我做过一个工业数据采集项目,传感器每秒产生几十KB的数据,用的就是批量传输。

特点:

  • 可靠传输:硬件层面有CRC校验和重传机制。数据错了?自动重发,直到正确为止。
  • 带宽动态分配:USB总线空闲时,批量传输可以跑满带宽。总线忙?那就等着,优先级最低。
  • 单向或双向:可以配置为IN(设备到主机)或OUT(主机到设备)。
  • 数据包大小:全速模式下最大64字节,高速模式下最大512字节,超高速可达1024字节。

应用场景:

  • U盘读写:你拷贝文件时,用的就是批量传输。不着急,但数据不能错。
  • 打印机:打印任务数据量大,但可以等。
  • 数据采集卡:我那个项目里,采集到的温度、压力数据通过批量传输上传到PC。
  • MTP/PTP协议:手机连接电脑传照片,底层也是批量传输。

核心要点:批量传输适合"数据量大、不要求实时、但必须完整"的场景。如果你需要传几MB甚至几GB的数据,批量传输是首选。

我的经验:有一次调试U盘驱动,发现批量传输总是超时。查了半天,原来是端点描述符里的wMaxPacketSize写错了。全速设备最大64字节,我写成了128,主机根本不认。嗯,细节决定成败啊。

5.2 中断传输(Interrupt Transfer)—— 不是真的中断

很多初学者会被"中断"这个名字误导。其实USB中断传输并不是硬件中断,而是主机定期轮询设备,看看有没有新数据。你想想看,USB是主从架构,设备不能主动发数据,只能等主机来问。

特点:

  • 保证最大延迟:每个中断端点可以设置轮询间隔(bInterval)。全速设备最小1ms,高速设备最小125μs(微帧)。
  • 小数据量:全速最大64字节,高速最大1024字节,但通常只传几个字节。
  • 可靠传输:和批量传输一样有CRC校验和重传。
  • 单向传输:每个中断端点只支持一个方向。

应用场景:

  • 鼠标:每次移动或按键,设备只传4-8个字节的数据。主机每1ms轮询一次,延迟很低。
  • 键盘:同理,按键信息必须及时上报。
  • 游戏手柄:摇杆和按钮状态需要低延迟反馈。
  • HID设备:大部分人机交互设备都用中断传输。

注意:中断传输的"中断"只是名字,本质是轮询。如果设备有大量数据要发,别用中断传输,用批量传输。我曾经见过有人用中断传输传音频数据,结果带宽不够,声音断断续续的。

5.3 同步传输(Isochronous Transfer)—— 实时但不可靠

同步传输是个"偏科生"。它追求实时性,但放弃了可靠性。数据丢了?不重传,继续往下走。为什么?因为音频视频这类数据,你重传一帧画面,播放时间已经过了,反而造成卡顿。

特点:

  • 恒定速率:带宽是预留的,保证每帧都能传输固定大小的数据。
  • 无重传:出错的数据直接丢弃,不重试。
  • 无CRC校验:或者说校验但不纠错。
  • 单向或双向:可以配置为IN或OUT。

应用场景:

  • USB摄像头:视频流必须实时传输,偶尔丢几帧不影响观看。
  • USB声卡:音频数据流要求恒定速率,不能因为重传导致声音断续。
  • USB麦克风:同理,实时采集音频。

一句话总结:同步传输适合"宁可丢数据,也不能等"的场景。如果你做音视频设备,大概率要用到它。

5.4 控制传输(Control Transfer)—— 一切的基础

控制传输是USB协议里的"元老"。每个USB设备必须支持控制传输,而且必须使用端点0。设备枚举、获取描述符、设置配置……这些基础操作全靠它。

特点:

  • 双向传输:一个控制传输包含建立阶段、数据阶段(可选)、状态阶段。
  • 可靠传输:有CRC校验和重传。
  • 带宽有保证:USB总线会预留10%的带宽给控制传输。
  • 数据量小:全速最大64字节,高速最大64字节,超高速最大512字节。

应用场景:

  • 设备枚举:主机通过控制传输获取设备描述符、配置描述符等。
  • 设置配置:主机发送Set Configuration请求,激活设备。
  • 自定义请求:厂商可以定义自己的控制请求,用于固件升级、状态查询等。
  • 类特定请求:比如HID设备的Get_Report请求。

避坑指南:我曾经在调试一个自定义HID设备时,控制传输总是返回STALL。查了协议栈才发现,是设备端处理控制请求时,状态阶段没有正确发送零长度包。记住:控制传输的状态阶段,如果是OUT方向,设备要发一个空包表示完成。

5.5 四种传输方式对比

传输类型 可靠性 实时性 数据量 典型应用
控制传输 高(有重传) 小(≤64字节) 枚举、配置、控制命令
批量传输 高(有重传) 大(可达512字节/包) U盘、打印机、数据采集
中断传输 高(有重传) 高(延迟有保证) 小(≤64字节) 鼠标、键盘、HID设备
同步传输 低(无重传) 最高(恒定速率) 中(带宽预留) 音频、视频、摄像头

嗯,这张表基本把四种传输方式的区别说清楚了。实际开发中,选哪种传输方式,取决于你的设备需求。我个人习惯是先确定数据量和实时性要求,再选传输类型。

总结一下:

  • 控制传输是基础,每个设备都得有。
  • 批量传输适合大数据量、不要求实时的场景。
  • 中断传输适合小数据量、要求低延迟的场景。
  • 同步传输适合实时流数据,可以容忍少量丢包。

好了,这四种传输方式就聊到这里。记住,USB协议的设计很巧妙,每种传输方式都有自己的定位。选对了,你的设备就能稳定高效地工作。选错了,调试起来可够你喝一壶的。

公众号:蓝海资料掘金营,微信deep3321