DECREQTPARM / DECREPTPARM —— 请求并报告终端参数(`CSI Ps x`)
VT100 时代的遗留探测 —— 让终端报告其串口参数(校验、位宽、波特率、时钟倍数、标志位)。比 DA / DA2 / XTVERSION 都早;现今几乎不该再用,但 xterm 与多数现代模拟器仍以合成默认值作答。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[<Ps>x\033[1x\e[1xESC [ Ps x1b 5b ... 78说明
DECREQTPARM —— 请求终端参数 —— CSI Ps x,Ps 选择「主动 vs 被动」语义。原本绑定到 VT100 物理串口:主机可问「你的波特 / 校验 / 位宽是多少」,终端在同条串线上回应当前设置。
请求:
- Ps = 0 —— 终端此后*可能*主动发 DECREPTPARM 响应(实际过时;几乎无模拟器实现 —— 这是主机管理多点串线设置的遗物)。
- Ps = 1 —— 立刻请求一次被动响应。
回复(DECREPTPARM) —— \x1b[<sol>;<par>;<nbits>;<xspeed>;<rspeed>;<clkmul>;<flags>x
- sol = 2 主动,3 被动(与请求匹配)。
- par = 校验 —— 1 无、4 奇、5 偶。
- nbits = 数据位 —— 1 八位,2 七位。
- xspeed = 发送速率编码(如 16 = 9600、24 = 38400、88 = 多数模拟器合成的「快」)。
- rspeed = 接收速率编码(通常与 xspeed 相同)。
- clkmul = 时钟倍数(真 VT100 恒为 1;现代模拟器回 1)。
- flags = STP / SET-UP / TIME 位字段(现代模拟器恒为 0)。
现代模拟器表现:
- xterm:完整回复且默认合理 —— 视构建而定多为 \x1b[3;1;1;112;112;1;0x 或 \x1b[3;1;1;88;88;1;0x。速率编码合成,无实际意义。
- kitty、wezterm、ghostty、iTerm2、alacritty、Konsole:均「最小实现」以免挂死遗留探测 —— 一般回 \x1b[3;1;1;112;112;1;0x 或类似。
- gnome-terminal:同样合成。
- Windows Terminal:1.18+ 构建回;早期构建静默。
- macOS Terminal:静默 —— 不回。探测挂到超时。
- cmd.exe / ConPTY:静默。
- Linux console(vt):多数内核上回 \x1b[3;1;1;112;112;1;0x。
2026 年你真要用吗?几乎不要。回复除了「终端活着且懂 ECMA-48」之外提供零信息,而 DA1(\x1b[c —— 见 csi-da)已经能更干净地答出型号 ID。若你在老代码里看到 DECREQTPARM,几乎可以肯定是 VT100 时代串线设置代码的遗留。请替换为:
- csi-da(DA1,\x1b[c)回答「这是 VT 类终端吗 / 哪个型号」。
- csi-da2-decoder(DA2,\x1b[>c)回答「模拟器类 + 固件版本」。
- xtversion(\x1b[>0q)回答「具体模拟器名 + 版本」(xterm 家族扩展)。
若必须用:发 \x1b[1x,从 stdin 读匹配 \x1b\[3;\d+;\d+;\d+;\d+;\d+;\d+x 的回复。务必加 100 ms 超时 —— 否则 macOS Terminal 用户会让你卡死。别把 xspeed/rspeed 当真波特率;模拟器只发常量。唯一偶尔携带信号的字段是 par(校验),且只在串口直连模拟器(gtkterm、picocom —— 均不在我们 12 终端支持表内)上有意义。
规范出处: DEC VT100 User Guide §4 (DECREQTPARM / DECREPTPARM) / xterm-ctlseqs (CSI Ps x)
参数
| Ps | 0 = 允许主动发送 DECREPTPARM(几乎所有实现都忽略)。1 = 立即请求一次被动 DECREPTPARM 回复。 |
示例
# Solicited probe — read reply non-blocking with 100ms timeout.\nprintf '\\033[1x'\nIFS= read -rs -d x -t 0.1 reply </dev/tty 2>/dev/null\necho \"DECREPTPARM: ${reply#$'\\033'}x\" # expect \\x1b[3;1;1;<spd>;<spd>;1;0ximport sys, re\nsys.stdout.write('\\x1b[1x'); sys.stdout.flush() # DECREQTPARM solicited\n# ... terminal-aware read of reply (cbreak + select + timeout) ...\n# Match: \\x1b[(\\d+);(\\d+);(\\d+);(\\d+);(\\d+);(\\d+);(\\d+)x\n# Fields: sol par nbits xspeed rspeed clkmul flags// DECREQTPARM — expect \"\\x1b[3;...x\" reply within 100ms or fall back to DA1.\nfmt.Print(\"\\x1b[1x\")// Node: probe + parse + fallback.\nprocess.stdout.write('\\x1b[1x');\n// On stdin 'data', match /\\x1b\\[3;(\\d+);(\\d+);(\\d+);(\\d+);(\\d+);(\\d+)x/\n// — fields are mostly synthetic on modern emulators; prefer DA1 + XTVERSION./* Fire-and-forget DECREQTPARM; most modern emulators answer with constants. */\nprintf(\"\\x1b[1x\"); fflush(stdout);\n/* Parse reply (cbreak terminal): sscanf returned buf,\n * \"\\x1b[%d;%d;%d;%d;%d;%d;%dx\",\n * &sol, &par, &nbits, &xspd, &rspd, &clkmul, &flags); */终端支持
- xterm
- 支持
- Linux console (fbcon)
- 支持
- macOS Terminal.app
- 不支持
- iTerm2
- 支持
- Windows Terminal
- 部分
- cmd.exe / ConPTY
- 不支持
- kitty
- 支持
- alacritty
- 支持
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 支持
- Konsole
- 支持
- tmux
- 支持
- GNU screen
- 支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 不支持 | 支持 | 部分 | 不支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |