[返回首页](../README.md) # Windows 串口服务器部署 本文仅说明 Windows 上将物理 COM 口发布为 RFC 2217 或原始 TCP 串口服务的方法。FRP 客户端配置、服务安装和防火墙规则请参阅 [FRP 客户端部署指南](frpc.md)。 ## 方案比较与建议 | 方案 | 适用场景 | RFC 2217 | Windows 服务 | 主要注意事项 | |---|---|---:|---:|---| | 原生 Windows `ser2net` | 可控制安装环境的开源生产部署 | 支持 | 需使用 WinSW 等包装器 | 必须安装相互匹配的 `ser2net`/`gensio` 版本 | | `hub4com` | 快速开源实验或维护旧部署 | 支持 | 需使用外部包装器 | 上游最后一个版本发布于 2012 年 | | HHD TCP/IP Serial Ports Server | 偏好 GUI 的商业部署 | 支持 | 内置 | 运行主机需要 HHD Virtual Serial Port Tools 许可证 | | FabulaTech Serial Port Redirector | 需要持续维护和厂商支持的商业部署 | 支持 | 内置 | 收费,按容量授权 | 建议如下: - 新建开源生产环境:优先使用原生 Windows `ser2net`。 - 快速实验室验证:`hub4com` 配置最简单,但必须评估其年代和稳定性限制。 - 需要 GUI、原生服务管理和商业支持:优先评估 FabulaTech。 ## 1. 安装转换器并确认 COM 口 使用 Windows Update 或芯片厂商提供的已签名驱动。不要在未确认硬件型号时尝试安装 FTDI、WCH 等不同厂商的驱动;应先检查硬件 ID。 在“设备管理器”中展开“端口(COM 和 LPT)”,选中转换器并打开“属性 → 详细信息”。记录以下信息: - COM 名称; - 包含 VID、PID 的硬件 ID; - 设备实例路径; - USB 序列号(如有); - 容器 ID; - 位置路径。 使用 PowerShell 盘点当前端口: ```powershell Get-PnpDevice -Class Ports -PresentOnly | Sort-Object FriendlyName | Format-Table Status, FriendlyName, InstanceId -AutoSize Get-CimInstance -ClassName Win32_SerialPort | Select-Object DeviceID, Name, Description, PNPDeviceID | Format-Table -AutoSize ``` 也可使用 pySerial 查看更详细的信息: ```powershell py -m pip install pyserial py -m serial.tools.list_ports -v ``` COM 编号只是 Windows 分配结果,不是持久的硬件身份。具有唯一序列号的 FTDI 转换器通常能稳定保留编号,但部分低价转换器没有序列号,或多个设备使用重复序列号。若无法通过序列号区分同型号设备,应固定其物理 USB 插口并记录位置路径。 端口编号达到 COM10 及以上时,各工具使用的写法不同: - 原生 Windows API:`\\.\COM10` - `ser2net`/gensio:`//./COM10` - pySerial:`COM10` ## 2. 方案 A:原生 Windows ser2net ### 2.1 安装 ser2net 和 gensio 截至 2026 年 7 月,上游(Corey Minyard 的 ser2net / gensio 项目)在各自 GitHub 发布页提供原生 Windows 安装包: - [`ser2net` 4.6.7](https://github.com/cminyard/ser2net/releases/tag/v4.6.7)(Windows 安装包在该 release 的 Assets 中); - [`gensio` 3.0.2](https://github.com/cminyard/gensio/releases/tag/v3.0.2)(同上)。 最新版本见 [ser2net releases](https://github.com/cminyard/ser2net/releases) 与 [gensio releases](https://github.com/cminyard/gensio/releases)。 预编译包之间存在版本耦合,应安装同期配套版本,不要任意混用: 1. `Gensio-3.0.2-windows.exe` 2. `Ser2Net-4.6.7-windows.exe` 使用更新版本前先检查上游发布说明,配套版本号会随时间变化。原生安装包使用 MinGW/UCRT 运行时 DLL,但运行时不需要 MSYS2 shell。 默认配置文件通常位于: ```text C:\Program Files\Ser2Net\etc\ser2net\ser2net.yaml ``` 以管理员身份创建或编辑该文件。 ### 2.2 配置 COM3 的 RFC 2217 服务 新部署应使用现代的 version-2 YAML: ```yaml %YAML 1.1 --- connections: com3: accepter: telnet(rfc2217),tcp,127.0.0.1,2217 connector: serialdev,//./COM3,115200n81 ``` 该配置具有以下行为: - 仅监听 IPv4 回环地址; - 允许同一 Windows 主机上的隧道客户端连接; - 不会额外在局域网接口上暴露通配监听器; - COM3 初始参数为 115200 波特、无校验、8 数据位、1 停止位; - 兼容的 RFC 2217 客户端可远程修改串口参数。 旧的 version-1 写法仍可被 `ser2net` 接受: ```yaml connection: &com3 accepter: telnet(rfc2217),tcp,127.0.0.1,2217 connector: serialdev,//./COM3,115200n81 ``` 但 version 1 有意不遵循标准 YAML。新部署必须优先使用 `connections:` 映射。 若只需要原始 TCP,不需要远程调整串口参数,可删除 `telnet(rfc2217)`: ```yaml %YAML 1.1 --- connections: com3-raw: accepter: tcp,127.0.0.1,2217 connector: serialdev,//./COM3,115200n81 ``` 远端客户端需要选择波特率时,不要使用原始 TCP 模式。 ### 2.3 交互式本机测试 创建服务前,先在管理员 PowerShell 中前台运行: ```powershell & 'C:\Program Files\Ser2Net\bin\ser2net.exe' ` -d ` -c 'C:\Program Files\Ser2Net\etc\ser2net\ser2net.yaml' ``` `-d` 会保持前台运行并输出诊断信息。测试完成后按 `Ctrl-C` 停止。 若已安装 gensio 客户端工具,可测试本机协议栈: ```powershell gensiot 'telnet(rfc2217),tcp,127.0.0.1,2217' ``` 仅能建立原始 TCP 连接,不能证明 RFC 2217 完整可用;还必须使用 pySerial 等兼容客户端实际测试一次波特率变更。 ### 2.4 使用 WinSW 注册 Windows 服务 官方 Windows `ser2net` 安装程序不会创建原生 Windows 服务。不要使用 `sc.exe create` 直接注册 `ser2net.exe`:它是控制台程序,没有实现 Windows Service Control Manager 生命周期。 使用 [WinSW](https://github.com/winsw/winsw) 等服务包装器: 1. 将稳定版 WinSW 放在 `ser2net.exe` 所在目录。 2. 将 WinSW 重命名为 `ser2net-service.exe`。 3. 在同一目录创建同名配置文件 `ser2net-service.xml`: ```xml ser2net-rfc2217 ser2net RFC 2217 Exports Windows COM ports through RFC 2217 %BASE%\ser2net.exe -n -c "%BASE%\..\etc\ser2net\ser2net.yaml" %BASE% C:\ProgramData\Ser2Net\logs 1 hour ``` 在管理员 PowerShell 中创建日志目录,然后安装、启动并检查服务: ```powershell New-Item -ItemType Directory -Force C:\ProgramData\Ser2Net\logs & 'C:\Program Files\Ser2Net\bin\ser2net-service.exe' install & 'C:\Program Files\Ser2Net\bin\ser2net-service.exe' start & 'C:\Program Files\Ser2Net\bin\ser2net-service.exe' status ``` 上述示例为简化部署而使用 WinSW 默认服务账户。生产环境应改用专用的最小权限服务身份,只授予必要的程序文件、配置文件和日志目录访问权限。 也可以用 NSSM 代替 WinSW 包装 `ser2net.exe`,命令模式与 [FRP 客户端部署指南的 NSSM 小节](frpc.md#4-备选使用-nssm) 一致,只需替换可执行文件与参数。 ## 3. 方案 B:hub4com com0com 项目包含提供 RFC 2217 功能的 `hub4com` 包装器。若发布的是现有物理 COM 口,不需要创建 com0com 虚拟串口对。 上游基础示例为: ```bat com2tcp-rfc2217 COM3 7001 ``` 该命令默认监听所有 IPv4 接口。供本机隧道客户端使用时,应显式绑定回环地址并使用规范 COM 写法: ```bat com2tcp-rfc2217 --interface 127.0.0.1 \\.\COM3 7001 ``` 高编号端口(例如 COM17): ```bat com2tcp-rfc2217 --interface 127.0.0.1 \\.\COM17 7001 ``` 包装器默认会持续占用物理 COM 口。若只希望在网络客户端已连接时打开串口,可使用: ```bat com2tcp-rfc2217 --interface 127.0.0.1 --share-com-port \\.\COM3 7001 ``` 仅在业务确实要求连接间释放端口时使用 `--share-com-port`;该选项不代表多个进程可以安全地并发占用同一串口。 ### 3.1 限制与服务化 - 上游最新 `hub4com` 版本为 2012 年发布的 2.1.0.0。 - 分发的可执行文件是 32 位控制台程序。 - 不内置 Windows 服务宿主。 - 不提供 TLS、身份认证或访问控制。 - 必须在实际部署镜像上验证现代 Windows、USB 重连、睡眠/恢复、服务账户和长时间运行行为。 只需要发布物理 COM 口时,不要安装 com0com 内核驱动。已签名的 com0com 驱动只在创建虚拟 COM 对时需要,典型场景是 Windows 客户端必须向旧应用呈现本地 COM 口。 服务化时可沿用前述 WinSW 模式:将 `com2tcp-rfc2217` 包装命令拆分为 WinSW 的 executable 和 arguments,并将 working directory 指向解压后的 `hub4com` 目录,确保可执行文件和插件能被找到。上线前应启用失败重启,并执行冷启动、USB 重插和睡眠恢复测试。 ## 4. 方案 C:商业 GUI 产品 ### 4.1 HHD TCP/IP Serial Ports Server HHD TCP/IP Serial Ports Server 可将现有物理或 USB COM 口发布为原始 TCP 或 RFC 2217,并提供 GUI、命令行管理和内置 Windows 服务安装能力。 安装为服务: ```bat psip_server.exe -install-service ``` 文档给出的独立端口映射命令为: ```bat psip_server.exe COM5=11111 ``` 省略协议时默认使用 RFC 2217;`,raw` 用于选择原始 TCP。 部署前必须确认以下限制: - 根据厂商文档,服务会监听所有可用网络接口。如果预期只通过隧道访问,必须限制其局域网直接访问。 - 当前公开的服务器文档中未验证到内置 TLS 功能。 - HHD 的再分发文档说明:运行 TCP/IP Serial Ports Server 的计算机需要 Virtual Serial Port Tools 许可证。 - HHD 另有一个限制条件不同的 Free Virtual Serial Ports 产品;不能据此假定 TCP/IP Serial Ports Server 已获得生产许可。 部署前向 HHD 确认当前试用条款和生产授权条件。 ### 4.2 FabulaTech Serial Port Redirector 应选用 **Serial Port Redirector**,而不是 Network Serial Port Kit。该产品支持: - 物理 COM 口服务器模式; - RFC 2217 和原始 TCP; - GUI 和 `SPRCmd.exe` 配置; - 作为 Windows 系统服务在用户登录前运行; - x86、x64 和 ARM64 安装包; - 厂商所述的可选证书式 SSL,以及可选客户端认证。 文档中的物理串口服务器命令为: ```bat SPRCmd.exe setserver telnet-bin 3 7001 physical ``` 该语法可能随产品版本变化;自动化前必须用已安装版本的帮助信息复核。 FabulaTech 是按容量收费的商业产品,试用期有限。公开说明没有完全明确试用期间物理服务器端口的计数方式,应向厂商确认。厂商将加密传输称为“SSL”,但已审阅的公开资料未说明实际启用的 TLS 协议版本和密码套件基线;如涉及合规要求,必须单独验证。 ## 5. 故障排查 Windows 侧的常见问题——COM 口占用或拒绝访问、重新连接后 COM 编号变化、开机时序(服务早于 USB 枚举)、hub4com 意外监听 LAN、原生 ser2net 无法加载 DLL——集中在 [故障排查](troubleshooting.md) 一页的“Windows 特定问题”一节,此处不再重复。