主题
TenoDX 串口自动配置工具
把 TenoDX 控制器按 1P / 2P 角色和 HID / IO 模式固定到不同 COM 口号。
| 角色 | 模式 | Touch | LED | Aime | Debug |
|---|---|---|---|---|---|
| 1P | HID | COM3 | COM21 | COM1 | COM25 |
| 2P | HID | COM4 | COM23 | COM2 | COM26 |
| 1P | IO | COM13 | COM21 | COM1 | COM25 |
| 2P | IO | COM14 | COM23 | COM2 | COM26 |
IO 模式下,游戏内 mod 只连接两块主控的 Touch 口(COM13 / COM14), 按键和触摸都由该 CDC0 复合帧传输。
用法
方式一:双击 exe(推荐)
text
dist\TenoDXSetComPorts.exe点「一键配置」即可。改口号需要管理员权限,工具会弹 UAC 请求提权。 提权后的结果会同时写入 set_com_ports.log,便于排查 UAC 子进程问题。
方式二:命令行
powershell
py -3.14 set_com_ports.py --list # 只读:列出检测结果
py -3.14 set_com_ports.py --list --role 1p --mode io
py -3.14 set_com_ports.py --selftest # 验证 IP/2P、HID/IO 口号方案
py -3.14 set_com_ports.py --apply # 单板按 1P 配置,双板默认 1P/2P
py -3.14 set_com_ports.py --apply --role 2p
py -3.14 set_com_ports.py --apply --mode io
py -3.14 set_com_ports.py --apply --serial <NS> --role 2p --mode io
py -3.14 set_com_ports.py --restore # 清除固定口号,交回系统重新分配
py -3.14 set_com_ports.py --apply --restart # 额外尝试 pnputil 重启,慎用打包 exe
powershell
powershell -ExecutionPolicy Bypass -File .\build.ps1实现原理
不改驱动、不碰硬件,走 Windows 官方设备树机制:
- 设备实例路径形如
USB\VID_0483&PID_5740&MI_0X\<instance>; 串口号存在该实例的Device Parameters\PortName。 - 用 cfgmgr32 的
CM_Set_DevNode_PropertyW(DEVPKEY_Device_PortName)写入; 若该属性键在目标系统上不可用,回退到直接写注册表HKLM\SYSTEM\CurrentControlSet\Enum\USB\VID_0483&PID_5740&MI_0X\<instance>\Device Parameters\PortName(设备管理器「端口设置 → 高级」改的就是这个值)。 - 默认只写注册表,不自动移除设备。部分 usbser 驱动在
pnputil /restart-device后不会自动回枚举,因此工具提示拔插一次 USB; 只有显式加--restart才会尝试自动重启。 - 每步之后回读注册表确认真的生效,不是"以为写成功了"。
行为细节
- 只处理当前在线的板子:历史(幽灵)设备实例不会被改动。 插拔过不同 USB 口的板子会在注册表里留下多条实例,工具只挑在线的那条。
- 口号被占用时自动让位:如果目标口号(如 COM3)当前被同一块板子的另一个接口占着, 先把占用者释放,再分配给目标接口。
- 多块板子同时在线:GUI 按检测顺序默认第一块 1P、第二块 2P,可用 「交换 1P/2P」纠正;CLI 用
--serial <NS>和--role指定。 - 两套角色的目标口号互不重叠,因此两台主控可以同时固定。
- 幂等:已经是目标口号就跳过,可以反复点。
--restore删除PortName,拔插一次 USB 后 Windows 会重新分配口号。
环境要求
- Windows 10/11
- 管理员权限(写 HKLM 设备树)
- 图形界面需要 tkinter(CPython 官方安装包自带)
- 仅打包 exe 时需要 PyInstaller
常见问题
| 现象 | 原因 / 处理 |
|---|---|
| 提示"未检测到在线的 TenoDX 控制器" | 板子没插好,或驱动没装(设备管理器应能看到 4 个「USB 串行设备」) |
| 提示"没有权限(需要管理员)" | 没提权。右键"以管理员身份运行",或在 UAC 弹窗里点是 |
| 配置成功但口号没变 | 拔插一次 USB,让 usbser 重新读取注册表里的 PortName |
| 口号变了但上位机连的是老口号 | 先确认该口号已经出现在设备管理器的 COM 列表,再重开上位机 |
文件说明
| 文件 | 说明 |
|---|---|
set_com_ports.py | 工具本体(GUI + CLI,无第三方依赖,只用标准库 ctypes/tkinter/winreg) |
build.ps1 | PyInstaller 打包脚本,产出 dist\TenoDXSetComPorts.exe |
README.md | 本文件 |