先说明一点如果你玩过单片机、用过STM32或者折腾过各种工控板子大概率对“虚拟串口”这个词不陌生。项目里要调两个上位机软件互相通信、要模拟GPS数据、要抓串口协议最省事的办法就是在电脑里装一对虚拟串口把数据从物理串口“桥接”到虚拟串口上。而这活儿在Windows 10下最常用的工具就是com0com。之所以专门写这篇是因为com0com这套驱动本身是开源免费的但坑全在后头。最大的坑就是驱动签名冲突Win10对驱动签名卡得非常严com0com的驱动又是老牌开源项目签名链在Win10 22H2这类新版本系统上经常不认。我见过太多人装到一半弹个“Windows无法验证此驱动程序软件的发布者”然后整个项目卡死在串口通信上。这篇就把我从下载到配置、从签名冲突到最终跑通的完整过程拆开讲该注意的地方一个都不跳过。1. 动手前先搞懂com0com到底解决什么问题1.1 虚拟串口的核心价值和适用场景com0com全称是“Virtual Serial Port Driver”它在Windows里创建一对互相连通的虚拟串口。比如你创建了COM3和COM4那么往COM3发数据的软件会在COM4上收到这些数据反过来也一样。它不依赖任何实体硬件纯靠驱动在系统内核里模拟串口读写。我用它最多的场景有三个两个串口调试助手之间打通链路比如用Modbus Poll连接Modbus Slave中间不需要真实设备就能先验证协议逻辑。对接老式工控软件。很多上位机只认固定串口号但设备在别的口上用com0com把物理串口和虚拟串口配对软件就可以无感切换。调试嵌入式设备固件。STM32的板子通过USB转串口连接电脑我想同时用串口助手和协议分析工具监听同一个端口但Windows不允许两个进程同时占用同一个COM口这时候就需要一个虚拟串口转发器。本质上com0com就是给Windows串口体系加了一层“软路由”。理解了这层后面遇到配置问题就不会慌。1.2 驱动签名冲突为什么会冒出来Windows 10从64位系统开始强制要求内核驱动必须有微软认可的签名目的是防止恶意软件加载未签名的驱动。com0com的驱动本来是有签名的但老版本签名证书过期、或者签名算法太老比如还是SHA-1在较新的Windows 10版本上就会触发系统的安全拦截表现就是安装时弹窗提示“发布者未知”装到一半直接回滚设备管理器里能看到带黄色感叹号的设备。另外一个常见渠道是下载了非官方打包的“破解版”或“绿色版”这些版本可能被二次打包过签名被破坏系统自然不认。所以装com0com之前先搞清楚你这个系统对驱动签名卡得多紧。Win10家庭版、专业版、企业版、LTSC的处理方式不完全一样后面我会把三种解决方案都写上你按自己的情况选一种就行先别着急。2. 准备工作避开安装过程中的几个坑2.1 版本选择与下载来源的判断com0com的官方仓库现在托管在GitHub上项目名叫“com0com”发布页面里能找到最新版和旧版安装包。很多人下载时容易拿错版本这里有个非常关键的点新版的com0com在Win10 22H2上不一定比旧版好用。我用过3.0.0.0、2.2.11.0这几个版本实际体验是2.x版本驱动结构简单安装包小签名冲突的报错路径相对固定容易排查。3.x版本把驱动架构调整过和某些国产串口工具存在兼容性问题甚至会蓝屏。如果你只是想要一对稳定可靠的虚拟串口我个人建议优先试2.2.11.0如果系统拦得厉害再考虑3.x。下载时还要注意区分32位和64位安装包。Win10 x64系统一定要选x64版本装错版本不会有明显提示但驱动加载时会直接报签名错误或“找不到指定文件”非常误导人。2.2 系统环境检查驱动签名策略和系统版本对应关系在动安装包之前先干两件事查系统版本、查当前驱动签名策略。查系统版本很简单WinR输入winver看版本号和内部版本号。比如机器上显示“版本22H2OS 内部版本19045.xxxx”那说明这属于Windows 10 22H2对老驱动签名的容忍度已经是比较低的了。如果是LTSC版本系统更精简但也更容易因为缺少某些系统组件导致com0com安装后设备不出现这一点后面会讲到。接着查签名策略。以管理员身份打开命令行输入bcdedit /enum看输出里的testsigning和integritycheck这两项。testsigning On表示系统已开启测试签名模式com0com这类未签名或旧签名驱动可以正常加载。testsigning Off表示系统处于默认的强制签名状态此时装com0com大概率会遇到签名拦截。把这两项状态记下来然后开始按下面的方法装。3. Windows 10下com0com安装完整实操3.1 常规安装流程与驱动签名拦截点拿到安装包后右键选择“以管理员身份运行”。安装包向导界面很简单基本一路Next但注意不要急着点Finish。安装过程中如果杀毒软件突然拦截提示“检测到驱动行为”先暂时放行com0com相关的安装程序否则驱动文件会被隔离装完但设备管理器里看不到任何东西。安装完成后很多时候并没有自动弹出配置界面。新版安装包自带的配置工具叫setupc.exe运行时会创建一个默认的COM对比如CNCA0和CNCB0。我这里用命令行做配置原因有两个一是图形界面在新版Win10上偶尔白屏二是命令行可以通过脚本固化配置重装系统后一条命令恢复串口对效率高得多。打开管理员命令行进入com0com的安装目录通常是C:\Program Files (x86)\com0com先执行cd /d C:\Program Files (x86)\com0com setupc.exe list如果安装成功这条命令会列出当前存在的虚拟串口。没列出来就说明驱动没装上直接跳到第4章的签名处理方案。3.2 用命令行配置COM端口对有默认端口对的情况下先把它清掉再创建自己的端口对setupc.exe delete CNCA0 setupc.exe delete CNCB0 setupc.exe create COM8COM9后半句的意思是把COM8和COM9配对。这里有一个很容易踩的坑虚拟串口号不要和物理串口号撞车。如果电脑本身有COM1、COM3你创建的COM8、COM9不会冲突但创建COM1、COM3就会被占用命令不报错可用串口工具打开时要么打不开要么打的是物理口。创建完以后建议再执行一次setupc.exe list确认一下能看到类似这样的输出就说明配对成功了COM8 COM9顺便提一句setupc还有很多参数比如改串口描述名称、设置波特率忽略等。我在默认情况下都不用动这些保持默认就能满足90%以上的场景。除非你有特殊需求比如希望软件往虚拟串口写数据时不被物理串口的波特率拖累这时可以用setupc.exe /portname COM8 MyVirtualPort setupc.exe /emulation COM80但小白阶段不建议乱调默认最好。3.3 配置后如何验证虚拟串口已生效串口对创建完还没算完必须验证一次数据通路。最简单的验证方法是打开设备管理器展开“端口COM和LPT”看能不能找到两个相连的COM口。然后在两个串口助手里分别打开COM8和COM9一个发字符串另一个能看到数据通路就通了。如果没有现成的串口助手用命令行也能验证。Windows自带的mode命令可以列出COM口状态但真正收发数据还是得靠工具。我个人常用的是自己写的脚本用Python的pyserial库发一段测试数据import serial import time port_a serial.Serial(COM8, 115200, timeout1) port_b serial.Serial(COM9, 115200, timeout1) port_a.write(bhello com0com) time.sleep(0.2) resp port_b.read(100) print(resp) port_a.close() port_b.close()跑完能打印出bhello com0com说明配对没问题。如果你在安装这一步就遇到了签名拦截先别急着创建端口对下一步是关键。4. 驱动签名冲突三种解决思路与实战操作4.1 一次性方案临时关闭驱动签名强制这是最简单的办法适合只想把com0com装上、用完就不管的情况。步骤是设置 → 更新和安全 → 恢复 → 高级启动 → 立即重新启动 → 疑难解答 → 高级选项 → 启动设置 → 重启 → 按数字键7或F7选择“禁用驱动程序强制签名”。重启后系统处于签名关闭状态但只对本次开机有效。此时再去安装com0com驱动签名检查会直接被跳过安装过程一路顺畅。装好驱动、创建好串口对之后你不需要一直保持这种状态下次正常重启系统会恢复默认的强制签名策略而已经装好的com0com驱动能继续工作。这里有一个细节普通重启不会进入启动设置菜单必须通过上面那套“高级启动”路径。很多人直接在开机时按F8在Win10上有时候有效有时候无效因为从Win8开始F8启动菜单默认被关闭了正确路径还是去设置里走“高级启动”。这个方案对新手最友好缺点是不能每次开机都保持签名关闭状态。如果你需要反复安装或者频繁重装系统每次都去启动设置选一次会有点烦。4.2 长期方案开启测试签名模式并导入自签名证书如果要长期安装多个未签名驱动或者想一劳永逸地避免签名弹窗可以打开Windows的测试签名模式。管理员命令行执行bcdedit /set testsigning on重启后系统右下角会多出一个“测试模式”的水印这是正常现象。此时系统会允许加载未签名驱动com0com可以直接装。但这里有个隐患打开测试签名模式会降低系统安全性不建议在长期办公的主力机上常年开启。如果你只在开发机上折腾那问题不大。最好的做法是装完com0com之后再执行bcdedit /set testsigning off关闭测试模式。不过这样做的后果是下次重装com0com驱动时可能又会被拦。所以我一般是配合自签名证书一起用把com0com的驱动程序重新签名一次让系统在正常模式下也认它。自签名的操作稍微繁琐一些但属于一劳永逸。大致流程是用Windows SDK里的makecert工具生成一个测试证书把证书导入系统“受信任的根证书颁发机构”再用signtool对com0com的驱动文件重新签名。网上关于自签名驱动的教程不少但要注意自签名证书不是微软签名系统对某些设备驱动仍然会有严格检查所以这个方法更适合配合测试签名模式使用而不是完全替代它。4.3 进阶方案修改BCD配置绕开完整性检查如果以上两种方法都试过还被拦可以尝试修改BCD的完整性检查策略。管理员命令行执行bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS bcdedit /set integritycheck off重启后再装com0com。这个方法实际上是让Windows启动时不进行内核完整性校验比测试签名模式更彻底风险也更高。系统一旦出现蓝屏排查难度会增大所以只建议在专用测试机器上操作主力机千万别开。4.4 三种方案的对比与选型建议方案操作难度持久性安全性适用场景临时禁用驱动签名低单次开机高只安装一次后续不折腾测试签名模式 自签名中可持续中长期开发需要反复装驱动修改BCD完整性检查中高持久低专用测试机、老驱动调试我一般推荐顺序是先用临时禁用签名把com0com装好够用了就不折腾。如果后面需要多次重装再考虑开测试签名模式。修改BCD那招我在自己的开发机上试过确实能解决问题但有一次装完一套老工控驱动后系统不稳蓝屏两次后来老老实实把完整性检查关了回去用回测试签名模式。串口调试这种工作稳定比什么都重要。5. 虚拟串口使用中的常见问题与排查实录5.1 安装后设备管理器看不到COM口这个问题的经典场景是安装包一路Next日志也显示成功但设备管理器里找不到任何一个带com0com字样的节点。先检查安装目录下有没有com0com.sys这个驱动文件。如果文件存在但设备不出现多半是驱动加载被系统拒绝典型的代码是“Windows 无法验证此驱动程序软件的发布者”。回到第4章用对应方案解决签名问题。如果文件本身就不存在说明安装过程中驱动被安全软件拦截了或者安装包没有以管理员身份运行。把杀毒软件临时关掉右键重新以管理员身份运行一次基本能解决。5.2 设备管理器出现黄色感叹号、代码52代码52的意思是“Windows无法验证此驱动程序的数字签名”。非要把这行字看清的话就是系统强制签名策略把你拦住了。处理方法是先用第4章的临时禁用签名方案重启一次安装驱动然后在命令行里执行setupc.exe install再装一遍驱动。如果还报52就升级到测试签名模式再安装。实测下来多数机器走到测试签名模式这步问题就消失了。5.3 串口助手打不开虚拟串口能ping通吗不这里不是网络是串口工具。如果你在设备管理器看到COM8和COM9都在但串口助手打开时提示“打开失败”或“端口被占用”先看是不是有其他程序比如某个调试工具的后台进程已经占用了这个口。Windows的串口是不能被两个进程同时打开的com0com虽然虚拟但同样遵守这个规则。排查方法是用系统自带的任务管理器看哪些进程在运行或者直接重启电脑释放所有句柄。还有一种情况比较隐蔽你创建了COM8COM9同一个串口助手里只打开了COM8然后再去打开COM9理论上是可以的因为COM8和COM9是两个独立的端口对象。但如果打开的是同一个COM8两次必然报错。5.4 和CH340、FT232、STLink驱动的共存问题很多做嵌入式开发的人会遇到电脑上装了CH340、FT232、STLink的驱动再装com0com之后就出现一个现象——CMO口的排序乱了原本是COM3的设备变成了COM4或者某个真实设备不见了。原因是Windows会动态分配COM口号com0com创建虚拟串口时会抢占一个可用编号。解决方法有两个一是创建虚拟串口时避开现有的低编号COM口比如统一用COM20以上的编号。二是用设备管理器手动给真实设备固定一个COM口号右键设备 → 属性 → 端口设置 → 高级然后把“COM端口号”改成固定的这样无论什么时候插拔设备COM口号都不会变。5.5 数据丢包、乱码和回环测试异常虚拟串口在数据链路层不会像物理串口那样受线材、电平干扰影响所以理论上不应该出现乱码。但如果你发现用com0com桥接两个程序时一直有间歇性乱码或者数据缺失先检查两端的波特率、数据位、停止位是否一致。很多人在串口助手里一边设9600一边设115200链路是通的但数据都是乱的看起来像驱动问题其实是配置问题。还有一种可能是上位机软件用了非标准的串口参数比如奇偶校验配置不一样。com0com默认是透传模式不管两端波特率是否一致都能通但数据帧格式如果不对接收端就会丢帧。我自己测试时习惯先用Python脚本做一次回环压力测试连续发送几千个字节统计接收端收到的字节数是否完整。这比用肉眼盯着两个串口助手看要可靠得多。5.6 卸载残留导致的重装失败com0com卸载后设备管理器里有时还会残留一个带问号的未知设备或者注册表里留着旧驱动的状态。此时重装经常会失败卡在“已安装最新版本”或者“找不到指定文件”。彻底清理的方法卸载程序里先卸载com0com本体然后设备管理器里右键未知设备 → 卸载设备勾选“尝试删除此设备的驱动程序”。如果注册表有残留用管理员命令行执行setupc.exe uninstall再去设备管理器 → 查看 → 显示隐藏的设备里把残留节点删掉。做完这些再重装干净利落。6. 进阶玩法与效率技巧一次配置永久复用6.1 把端口对配置写成批处理脚本串口调试项目经常会有明确的端口规划比如调试Modbus时固定用COM20和COM21调试GPS模拟时固定用COM30和COM31。与其每次打开setupc慢慢敲命令不如把配置封装成一个bat脚本echo off cd /d C:\Program Files (x86)\com0com setupc.exe delete CNCA0 setupc.exe delete CNCB0 setupc.exe delete COM20 setupc.exe delete COM21 setupc.exe create COM20COM21 setupc.exe list pause这里的delete COM20即使没有也会执行但命令不会报致命错误所以放心写。重装系统或者换电脑之后双击这个脚本就能把串口对一次性建好非常省事。6.2 用虚拟串口桥接物理设备做数据监听如果你手里的USB转串口设备比如CH340、FT232、STLink/自带串口只占用了COM5而你想同时用两个软件去分析这个设备的数据可以在com0com里创建一对虚拟串口COM10COM11然后在物理串口COM5和虚拟串口COM10之间架一个软件桥。这个桥接软件用Python很容易实现import serial import threading def forward(src, dst): while True: data src.read(1024) if data: dst.write(data) serial5 serial.Serial(COM5, 115200, timeout0) serial10 serial.Serial(COM10, 115200, timeout0) threading.Thread(targetforward, args(serial5, serial10), daemonTrue).start() threading.Thread(targetforward, args(serial10, serial5), daemonTrue).start() input(Press Enter to exit...)这样一来软件A连接COM5软件B连接COM11两边都能收到物理设备的数据实现“既是终端又是监听者”的效果。做Modbus主从调试时这招特别好用。6.3 配合串口调试工具实现协议模拟还有一种玩法是配合串口助手或者脚本用虚拟串口模拟一个完整的传感器或设备端。比如给某个上位机软件提供GPS数据不需要真实GPS模块写一个脚本定时往虚拟串口里扔NMEA格式的GPS语句就行。上位机连接那个虚拟串口的另一头看起来就跟真实设备一样。这种模拟在开发阶段能省下大量连接真实硬件的时间。com0com在这套方案里的角色就是提供一个绝对稳定的串口通道不会因为硬件拔插、静电、线材问题而中断。7. 写在最后几个我踩过坑后的真实体会装了这么多年com0com我最深的感受是这个工具本身很简单麻烦全在Windows的驱动签名机制上。所以如果你是新装系统第一件事别急着装com0com先把系统激活、必备驱动装完、做一个完整备份再折腾虚拟串口。一旦系统出现问题几分钟就能回滚比在坏环境里反复排查省心得多。另外碰到报错先别骂工具。我遇到过好多次客户说com0com不行远程一看是他电脑里装了两套不同版本的USB转串口驱动互相打架。把旧驱动清干净com0com一装就通。最后一个实在的建议如果你只是偶尔用一下虚拟串口临时禁用签名那条路就够如果你天天和串口打交道建议认真配一次测试签名模式然后把端口对脚本固定下来。一次折腾后面省出来的时间够你多调试几十个设备了。
企业数字化 ERP 产品动态
相关推荐
芯片设计师四方向全拆解:前端、验证、后端、模拟,入行避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:47:41
STM32+CH376S实现U盘读写完整指南:从硬件到代码实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:47:41
STM32寄存器与HAL库双轨开发实战:从点灯到OTA升级 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:47:35
河北鼎晟机电发电机出售一线品术实力如何 深夜的工地,照明灯忽然熄灭,塔吊静默停转;市政抢修现场,市电意外中断,抢修设备却等着通电启动;厂区车间里,服役多年的发电机组故障频发,想更新换代却摸不清发电机出售价格行情,怕买贵、怕买错、… · 2026/9/25 5:53:00
类“拼多多“《拼团交易平台系统》项目实战:从需求建模到设计模式拉满的营销系统设计 文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、… · 2026/9/25 5:52:54
智能车PCB设计避坑指南:嘉立创审核规则与立创EDA、AD、KiCad选型对比 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:52:54
FlexGen 仓库 Transformers 蒸馏实战:Distil* 小模型训练、部署与基准全流程指南 推理引擎大模型 【免费下载链接】FlexGen Running large language models on a single GPU for throughput-oriented scenarios. 项目地址: https://gitcode.com/gh_mirrors/fl/FlexGen 点击查看 免费下载 本指南基于 distillation 目录 中的 Distil* 蒸馏项目展开… · 2026/9/25 5:52:48
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37