5、USB批量传输与中断传输:深入理解四种传输方式
大家好,我是你们的老朋友。今天我们来聊聊USB传输中几个核心概念——批量传输、中断传输,顺带把同步传输和控制传输也捋一遍。说实话,我刚接触USB开发那会儿,也被这四种传输方式搞得晕头转向。后来在项目中踩过几次坑,才真正理解了它们各自的脾气。
嗯,咱们先看一张总览图,把这四种传输方式的关系理清楚。
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协议的设计很巧妙,每种传输方式都有自己的定位。选对了,你的设备就能稳定高效地工作。选错了,调试起来可够你喝一壶的。