CDC SetControlLineState
2025-07-11
本文链接为:http://www.usbzh.com/article/detail-1516.html ,欢迎转载,转载请附上本文链接。
1. SetControlLineState 请求用途
SetControlLineState 用于生成RS-232/V.24风格的控制信号,模拟传统串口通信的控制线状态。
主机通过此请求控制设备的DTR(Data Terminal Ready)和RTS(Request To Send)信号,实现流控制和设备状态指示。
2. USB 控制传输格式
字段 | 值/说明 |
---|---|
bmRequestType | 0x21 (00100001B) 方向:主机到设备,类型:类,接收者:接口 |
bRequest | 0x22 (SET_CONTROL_LINE_STATE) |
wValue | 控制信号位图(Control Signal Bitmap,见下表) |
wIndex | 接口号 |
wLength | 0 |
Data | 无 |
3. Control Signal Bitmap Values(Table 51)
位 | 名称/说明 |
---|---|
D15..D2 | RESERVED(复位为0) |
D1 | 载波控制(半双工调制解调器)<br>对应V.24信号105和RS-232信号RTS<br>0:停用载波<br>1:启用载波<br>全双工模式下设备忽略此位 |
D0 | DTE存在指示<br>对应V.24信号108/2和RS-232信号DTR<br>0:不存在<br>1:存在 |
位图示例:
- wValue = 0x0001:DTR=1(DTE存在),RTS=0(停用载波)
- wValue = 0x0002:DTR=0(DTE不存在),RTS=1(启用载波)
- wValue = 0x0003:DTR=1(DTE存在),RTS=1(启用载波)
4. 典型主机端请求示例
C 结构体示例:
USB_SETUP_PACKET setup = {
.bmRequestType = 0x21, // 主机到设备,类,接口
.bRequest = 0x22, // SET_CONTROL_LINE_STATE
.wValue = 0x0001, // DTR=1, RTS=0
.wIndex = interface_number, // 通信接口号
.wLength = 0 // 无数据阶段
};
// 发送setup包,无data阶段
5. 设备端处理要点
- 解析 wValue 的低2位:
- D0:控制DTR信号
- D1:控制RTS信号(半双工模式)
- 根据信号状态控制硬件或模拟相应的控制线。
- 完成后通过状态阶段(Status Stage)ACK主机。
6. 常见应用场景
场景 | DTR | RTS | wValue | 说明 |
---|---|---|---|---|
设备连接 | 1 | 0 | 0x0001 | 主机准备就绪 |
数据发送 | 1 | 1 | 0x0003 | 主机请求发送数据 |
设备断开 | 0 | 0 | 0x0000 | 主机断开连接 |
流控制 | 1 | 0 | 0x0001 | 主机暂停数据接收 |
7. 参考
- USB CDC 规范 6.2.14](https://www.usb.org/document-library/class-definitions-communication-devices-12)
- RS-232 标准](https://en.wikipedia.org/wiki/RS-232)
- V.24 标准](https://en.wikipedia.org/wiki/V.24)