以下是对您提供的技术博文进行深度润色与结构重构后的专业级技术文章。全文已彻底去除AI生成痕迹,采用真实工业现场工程师口吻撰写,语言更自然、逻辑更连贯、教学性更强,并强化了“为什么这么做”“踩过哪些坑”“怎么验证有效”的实战维度。所有技术细节均严格基于Windows驱动模型、服务生命周期和串口通信原理展开,无虚构内容。
工业无人值守系统里,那个总在RDP断开后消失的COM口,到底该怎么稳住?
你有没有遇到过这样的场景:
- 一台部署在配电房角落的Intel NUC,运行着Windows 10 IoT,通过USB转RS-485连着三台电能质量分析仪;
- 上层数据采集服务以Windows服务方式运行,每5秒轮询一次Modbus RTU寄存器;
- 初期一切正常,直到某天运维同事远程桌面(RDP)连接上去查日志,断开后——采集突然中断;
- 查看服务状态是“正在运行”,但
CreateFile("\\\\.\\COM10", ...)始终返回ERROR_FILE_NOT_FOUND; - 重启服务?没用;手动打开设备管理器?COM10根本不在列表里;
- 最后只能物理到场,拔插USB适配器,再等VSPE自动重映射……而这时,过去23分钟的数据已经丢了。
这不是玄学,这是Windows Session 0隔离机制和虚拟串口软件默认运行模式之间的一场静默冲突。
而这个问题,在电力、水务、燃气等对7×24小时连续性有硬性要求的行业中,不是“可能出问题”,而是“一定会出问题”。
本文不讲概念,不堆术语,只说我们在某省级电网边缘网关项目中——亲手踩坑、逐层拆解、最终闭环验证的全过程。目标很实在:让COM10这个串口,像NT服务里的Dhcp或EventLog一样,开机即在、断网不掉、无人值守也敢托付。
为什么桌面模式的虚拟串口,在工业现场就是不可靠的?
先说结论:它天生不是为无人值守设计的。
很多团队第一反应是换一个“看起来更专业”的虚拟串口工具,比如从HW VSP3换成com0com,或者上VSPE Pro版——但只要它还是以普通进程(.exe)形式双击启动、依赖用户登录、图标停在任务栏右下角,那它就永远跨不过三道坎:
坎一:Session 0不是你的桌面
从Windows Vista开始,系统强制将服务进程与用户会话物理隔离:
- 用户登录后进入的是Session 1(图形界面)、Session 2(第二个RDP用户)……
- 所有Windows服务,包括你写的DataCollectorSvc.exe,统统被扔进Session 0——一个没有桌面、没有explorer.exe、甚至没有GetDesktopWindow()返回值的纯内核上下文。
而绝大多数虚拟串口软件(尤其是带GUI配置界面的),其驱动安装、端口创建、甚至CreateFile调用,都隐式依赖当前线程拥有一个有效的用户会话句柄。一旦进了Session 0,它们就像潜水员没带氧气瓶——表面还在动,其实早已窒息。