在进行硬件开发或设备调试时,经常会遇到一个棘手的问题:串口是被系统独占的资源。 一旦串口工具(如 WindTerm,Xshell,Putty等)连接了设备的物理串口,其他任何程序就无法再对它进行访问。
但在古法编程绝迹甚至这篇文章都是由AI完成的今天,我们往往需要将串口暴露给MCP工具,或者一些调用串口的SKILL,让 AI 能够直接读取设备日志和下发控制指令。如果我们把串口交给了 AI,自己就无法查看实时日志了,这怎么行?
解决方案: 使用 com0com 和 hub4com 组合,将一个物理串口“一分为二”。这样,串口和 MCP 工具就可以同时连接、同时收发数据。
系统架构与数据流向
通过虚拟串口技术,我们可以构建如下的结构:
flowchart TD
Dev[物理设备 COM7] <--> Hub{{"hub4com<br/>(Route: all:all)"}}
subgraph Pair1 [虚拟串口对 A]
COM9 <--> COM10
end
subgraph Pair2 [虚拟串口对 B]
COM11 <--> COM12
end
Hub <--> COM9
Hub <--> COM11
COM10 <--> User[串口工具]
COM12 <--> AI[MCP 服务]
%% 注释说明
linkStyle 0 stroke:#ff0000,stroke-width:2px,color:red;
linkStyle 1 stroke:#00ff00,stroke-width:2px,color:green;
linkStyle 2 stroke:#00ff00,stroke-width:2px,color:green;
- 物理设备的数据 → COM7 → hub4com → 广播给 COM9 + COM11 → 你和 AI 都能看到日志。
- 你发送的数据 → COM10 → COM9 → hub4com → 发给设备 (同时 AI 也能监听到你的操作)。
- AI 发送的指令 → COM12 → COM11 → hub4com → 发给设备 (同时你也能监听到 AI 的操作)。
1. 下载与安装
我们需要用到两个核心工具:虚拟串口驱动 com0com 和串口数据分发工具 hub4com。
1.1 安装 com0com
com0com 运行在内核层,负责在 Windows 中“凭空”捏造出成对的虚拟串口。
-
安装步骤:
- 解压下载的 ZIP 文件。
- 运行
setupg.exe(图形界面) 即可完成安装。 - 安装后,设备管理器中会出现一些预设好的串口对。
1.2 配置 hub4com
hub4com 运行在应用层,负责在物理串口和多个虚拟串口之间搬运数据。
- 下载地址: SourceForge hub4com 2.1.0.0
- 配置步骤: 将解压后目录内的
hub4com.exe复制到 com0com 的安装目录中。
2. 创建虚拟串口对
我们需要创建两对虚拟串口,一对给人工用(COM9 <-> COM10),一对给 AI 用(COM11 <-> COM12)。
这里的串口号以实际情况为准
可以直接使用命令行工具来创建
# 创建第一对虚拟串口 (COM9 与 COM10 互通)
./setupc.exe install PortName=COM9 PortName=COM10
# 创建第二对虚拟串口 (COM11 与 COM12 互通)
./setupc.exe install PortName=COM11 PortName=COM12
也可以直接使用配置工具来创建
验证是否创建成功:
- 打开 PowerShell 运行以下命令,你应该能看到创建好的几个模拟串口:
Get-PnpDevice -PresentOnly | Where-Object { $_.Class -eq "Ports" }
- 也可以直接在设备管理器中查看
3. 配置与启动 hub4com
3.1 启动数据转发服务
通过命令直接启动虚拟串口,双击运行即可开启服务(假设物理串口配置为COM7,115200,8N1):
& './hub4com.exe' --baud=115200 --data=8 --parity=no --stop=1 --octs=off --route=all:all //./COM7 //./COM9 //./COM11
也可以让它在后台运行
Start-Process -FilePath "./hub4com.exe" -ArgumentList "--baud=115200 --data=8 --parity=no --stop=1 --octs=off --route=all:all //./COM7 //./COM9 //./COM11" -WindowStyle Hidden
停止服务的方法: 在PowerShell中执行
taskkill /F /IM hub4com.exe即可杀掉转发进程,释放物理串口。
4. 接入与测试
- 常规调试接入: 打开串口工具,新建串口连接,目标选择 COM10,波特率设置为
115200(必须与 hub4com 启动参数一致)。 - MCP接入: 指定 COM12,波特率同样设置为
115200。
5. 使用的 MCP 工具
在将虚拟串口分配给 AI 使用时,我们推荐基于 Model Context Protocol 的桥接工具 putty-mcp。
- 原版开源项目: wgthomas/putty-mcp
原版工具主要针对类 Unix 系统设计,在 Windows 环境下对串口的支持并不友好,直接连接可能会出现无法连接的问题。
- 优化版: sypw233/putty-mcp
为了解决上述问题,我 Fork 了原项目并修正了 Windows 下的串口连接机制。具体的代码修复细节(路径规范化等)可以直接查看 GitHub 仓库的提交记录。
6. 已知问题:回显字符重复现象
在实际使用中,如果连接的是带有**本地回显(Local Echo)**功能的可交互式终端设备,可能会观察到以下现象:
当你通过人工调试端(例如在 COM10 的 WindTerm 中)输入命令 ls 时,在分配给MCP的监听端(COM12)控制台上,字符可能会重复显示为 llss。
原因分析:
这是由于 hub4com 的 --route=all:all 全双工广播机制与设备本身的终端回显叠加造成的。你发送的字符 l 被 hub4com 广播到了 COM12,同时物理设备收到 l 后触发的回显又被 hub4com 转发了一次到 COM12,从而导致了视觉上的字符翻倍。
影响评估:
虽然人类用肉眼看 llss 会觉得排版错乱,但如果 COM12 是专门作为 MCP 串口交由 AI 调用的,此现象完全没有负面影响。AI 模型和 MCP 工具在解析串口数据流时,是直接发送整行数据,并且主要依赖命令执行完毕后的标准输出结果(stdout),这种在输入阶段由于广播机制产生的回显重复,并不会干扰 AI 抓取日志或下发控制指令的逻辑。