简介:这份PDF操作指南面向需要卸载VSPD6.9却仍被虚拟串口COM口残留困扰的开发者与运维人员,聚焦彻底清除虚拟串口驱动及其设备管理器残留信息,避免影响新串口创建或系统稳定性。全包仅含1个PDF文件,大小约130KB,短小精悍,便于随查随用。已有7038人学习下载,说明该问题在串口调试与虚拟串口测试场景中较为常见。文档围绕虚拟串口重置、卸载后设备残留清理、注册表与安装目录检查等关键环节组织,可帮助读者理清清理顺序与排错思路,减少反复安装和无效卸载,适合作为VSPD6.9清理操作的参考清单。
1. 一个 COM3 抢不回来的下午:VSPD6.9 残留为什么越删越多
上周处理一台测试机,插上 USB 转串口模块,设备管理器翻来覆去只肯给 COM7,上位机脚本里写死的 COM3 死活打不开。追下去才发现,是上午刚卸掉的 VSPD6.9 留下的虚拟串口还在列表里蹲着——想彻底清除虚拟串口 COM 残留信息,光点卸载远远不够。VSPD6.9 这类虚拟串口驱动装起来两分钟,可它挂进内核的服务、登记在注册表里的设备实例、还有那个记录 COM 号占用的黑匣子,都不会跟着卸载向导一起走。更麻烦的是顺序:先删了主程序,界面上的「重置端口」按钮就一起没了,再想彻底删除 VSPD6.9 的端口配置,只能把安装包翻出来重装一遍。这篇记录写给两类人:脚本里写死 COM 号、换块板子就跑不起来的开发,以及收拾完机器发现端口越删越多的运维。路线是先盘环境,再装回去重置,然后一层层剥设备实例、注册表键和驱动包,最后拿三条命令确认机器真干净。
2. 动手前的环境盘点:VSPD6.9 的三种安装状态与三个必查入口
清理最忌讳上来就开设备管理器乱删。VSPD6.9 在这台机器上处于什么状态,直接决定第一步走哪条路。我一般把它分成三种:完整安装,程序列表、安装目录、后台服务三处都在;半删状态,程序列表里已经看不到,但设备管理器的端口还在、服务也还在跑;以及最麻烦的残废状态,主程序删了、目录删了,驱动服务注册项还在,系统每次开机都要尝试拉起一次必然失败的驱动。第一种可以顺着标准流程往下走,后两种都得先把安装包找回来覆盖一次,否则你连重置端口这个入口都摸不到。这一步不做,后面每一条命令都可能在跟一个状态未知的系统较劲。
2.1 确认 VSPD6.9 到底装没装、装在哪
先开一个管理员权限的 PowerShell,一条命令把程序、服务、目录三处痕迹一起查了。别只看「程序和功能」那个列表,VSPD6.9 是 32 位程序,在 64 位系统上它注册在 WOW6432Node 那一支,很多清理工具只扫 64 位分支,扫完告诉你没有,实际东西全在。
# 同时扫 64 位和 32 位卸载注册项,只留名字里带 Virtual Serial 的 Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object { $_.DisplayName -like "*Virtual Serial*" } | Select-Object DisplayName, DisplayVersion, InstallLocation, UninstallString # 按名字前缀查服务,服务名可能带数字后缀,所以用通配 Get-Service -Name "vspd*" -ErrorAction SilentlyContinue | Format-Table Name, Status, StartType # 查两个默认安装目录,顺带看最后修改时间判断是不是早就删了 Get-ChildItem "C:\Program Files\Virtual Serial Port Driver", "C:\Program Files (x86)\Virtual Serial Port Driver" -ErrorAction SilentlyContinue | Select-Object FullName, LastWriteTime第一段输出里,DisplayVersion用来核对版本,必须确认是 6.9,混进别的版本会让后面重装时驱动包对不上;UninstallString后面卸载时要用,先复制出来存着。第二段查服务,状态是 Running 说明驱动还活着,是 Stopped 但启动类型还是 Automatic 说明它下次开机还会起来,两种情况处理方式不同。第三段查目录,LastWriteTime停在很久以前,多半是卸载时删了一半。
三处全空也不代表干净。判断标准只有一条:设备管理器的「端口(COM 和 LPT)」下面还有没有那两个成对出现的 COM 口。有,就是残留,就得往下走。
2.2 权限、备份和还原点:清理前的后悔药
后面要动HKLM\SYSTEM\CurrentControlSet下面的东西,这是全系统最不能手滑的位置之一。动之前先把后悔药备齐:一个系统还原点,加三份注册表导出。还原点不是万能的,但它能在你删错了 Enum 分支、开机直接卡在转圈的时候给你一条退路。
:: 管理员 CMD 下执行,三份备份落到桌面,名字自己认得出就行 reg export "HKLM\SYSTEM\CurrentControlSet\Enum\ROOT" "%USERPROFILE%\Desktop\enum_root_backup.reg" /y reg export "HKLM\SYSTEM\CurrentControlSet\Services" "%USERPROFILE%\Desktop\services_backup.reg" /y reg export "HKLM\SOFTWARE\Virtual Serial Port Driver" "%USERPROFILE%\Desktop\vspd_sw_backup.reg" /y 2>nul :: 建一个还原点,名字写清楚,事后别自己都忘了是干嘛的 powershell -Command "Checkpoint-Computer -Description 'BeforeVSPDClean' -RestorePointType MODIFY_SETTINGS"reg export的/y是覆盖同名文件不弹确认;这里只导Enum\ROOT而不是整个Enum,是因为整个 Enum 导出来动辄几十兆,而 VSPD6.9 这种凭空创建的虚拟设备,实例全部挂在ROOT分支下,导这一支足够救命。第三行末尾的2>nul是把「键不存在」的报错吞掉——键不存在本身就是好消息,说明软件层配置已经清空。最后一行建还原点,系统如果关了系统保护,这条会失败,那就先在「系统属性 → 系统保护」里给系统盘打开保护再执行,别跳过。
还原点建完顺手记一下时间。真出事的时候,恢复点选错比不恢复还糟。
2.3 把现有串口占用记成一张清单
清理前后要有对比,否则你不知道自己到底删掉了什么。这一步把当前所有端口类设备列出来,重点看实例 ID(InstanceId),它是判断真假串口的唯一可靠依据。
# 列出所有端口类设备,包含状态异常的(残留设备通常是 Unknown 或 Error) Get-PnpDevice -Class Ports -ErrorAction SilentlyContinue | Sort-Object Status, FriendlyName | Format-Table Status, FriendlyName, InstanceId -AutoSize # 换个视角:系统当前认得的串口名清单 Get-CimInstance Win32_SerialPort | Select-Object DeviceID, Name, PNPDeviceIDStatus列出现Unknown的,基本就是被卸载后留在册子上的幽灵设备;InstanceId以ROOT\开头的,意味着这个设备不挂在任何物理总线上,完全由驱动凭空创建,VSPD6.9 建的虚拟串口就是这个特征。主板自带的串口是ACPI\PNP0501开头,USB 转串口是FTDIBUS\或USB\VID_开头,这三类混在一起的时候,靠名字根本分不清,只能看实例 ID。
| 判据 | 主板自带串口 | USB 转串口 | VSPD6.9 虚拟串口 |
|---|---|---|---|
| 实例 ID 前缀 | ACPI\ | USB\ / FTDIBUS\ | ROOT\ |
| 出现规律 | 固定存在 | 插拔时增减 | 成对出现,恒在 |
| 卸载后表现 | 不会消失 | 立即消失 | 变灰色或刷新后重现 |
| 典型端口号 | COM1 | COM3 以上 | COM1 到 COM10 之间 |
把这张表对着实际输出过一遍,用笔记下「VSPD 创建的端口有几个、分别是哪几个号」。这个数字是后面验证清理是否彻底的唯一基线,别嫌麻烦,我吃过没记的亏——清完发现还剩两个,根本想不起来是原来就有还是没删干净。
3. 反着来的一步:重装 VSPD6.9 再点重置端口,把端口对清零
整套流程里最反直觉的就是这一步:想删干净,先把软件装回去。很多人卡在这,觉得重装是倒退,实际上 VSPD6.9 的端口配置是保存在软件层的一对一映射表里的,卸载向导只会删程序文件,不会主动去解绑那些端口对。而解绑的唯一入口,就是软件界面上那个「重置端口」按钮。主程序没了,按钮就没了,映射表还在驱动里,于是你删一次、它回来一次,越删越多。
3.1 为什么卸载之前要先重装
先把逻辑理顺:VSPD6.9 卸载时会尝试移除注册表项、文件和服务,但它对「当前还挂着几对虚拟端口」这件事并不上心——端口对是运行时配置,卸载程序默认你已经不需要它们了,直接跳过。结果就是驱动的服务被摘了,映射表却留在注册表里,系统下次枚举端口时读到这些僵尸配置,又在设备管理器里把 COM 口给你摆出来。
重装的作用是把界面拿回来。覆盖安装不会新增端口对,一般会保留原有配置,装完打开软件就能看到当前还挂着哪几对。安装过程有三点要注意:安装包必须是同一个 6.9 版本,别拿更高版本去覆盖,会引入新的驱动包,清理工作量直接翻倍;右键用管理员身份运行,普通权限装到一半会卡在驱动注册;装完如果提示重启,先别重启,重启会把当前的残留状态打乱,等你重置完端口一起重启。
如果安装包已经找不到了,那就只能走另一条路:跳过重置,直接进设备管理器强删设备实例,再手工清注册表。这条路能走通,但漏删的概率高很多,因为映射表没有解绑,注册表里那几项会一直存在。常见做法还是想办法把安装包找回来,同一个版本,别图省事。
3.2 重置端口到底改了什么
打开 VSPD6.9,主界面中间是端口列表,上方有一排操作按钮,「重置端口」就在里面。点下去之后,软件会把当前所有虚拟端口对全部解绑、注销,界面上那一列 COM 号会清空,等于把软件层的映射表归零。注意它只动软件层:驱动还在,设备实例还在注册表里,设备管理器的端口列表也不会立刻变化,所以点完别急着高兴,这只是一半。
点之前可以先看一眼注册表里软件层的配置长什么样,心里有个数。
:: 两条都跑,32 位程序在 64 位系统上的位置不一样 reg query "HKLM\SOFTWARE\Virtual Serial Port Driver" /s reg query "HKLM\SOFTWARE\WOW6432Node\Virtual Serial Port Driver" /s有输出说明软件层配置确实写在这,重置之后可以再跑一遍对比,键还在但子项变少,就是解绑生效了。没有输出也正常,某些版本的端口对只存在内存和驱动通信里,不落盘到这两个键。/s是递归列出所有子键和值,输出可能比较长,重定向到文本文件再看更舒服。
这一步还有个附带好处:重置之后,如果卸载向导中途失败,你至少知道端口配置已经清了,剩下的只是文件和服务的清理,心理负担小很多。
3.3 重置后的自检:端口对清空没有
点完重置,做三件事确认状态。第一,软件界面的端口列表为空,一个 COM 号都不剩;第二,设备管理器里那些 COM 口还在,但已经没有任何程序在用了;第三,用命令数一下ROOT\开头的端口设备还剩几个,记下来,这是卸载前的最后基线。
# 数一下 ROOT 分支下的端口类设备,这个数字就是待清理的数量 (Get-PnpDevice -Class Ports -ErrorAction SilentlyContinue | Where-Object { $_.InstanceId -like "ROOT\*" }).Count这个数字和 2.3 节记的应该一致。如果不一致,比如重置之后反而变多了,说明重置过程中驱动重新枚举了一次,把之前隐藏的实例又激活了,这时候不要慌,接着往下走,卸载的时候会一起处理。如果数字是 0 但设备管理器里明明看得见,那多半是 PowerShell 的类筛选没覆盖到,换成Get-PnpDevice | Where-Object InstanceId -like "ROOT\*"全量筛一遍再数。
基线记好,就可以进卸载了。从这里开始,每做一步都回头看一眼端口数量,掉到 0 才算真的清完。
4. 三层剥离:卸载程序、摘除设备实例、清掉注册表与驱动包
到这一步,端口对的映射已经清空,剩下的是三层东西:程序本体、设备实例、驱动包和注册表键。顺序不能乱,先走官方卸载把程序摘掉,再用设备管理器把实例摘掉,最后手工清注册表和文件系统兜底。反过来做——先删设备再卸载程序——卸载向导会因为找不到设备而报错,留下一堆半成品状态。
4.1 控制面板卸载与设备管理器的正确顺序
先走标准卸载。控制面板 → 程序和功能 → 找到 VSPD6.9 → 卸载。2.1 节记下的UninstallString也可以直接在命令行里跑,效果一样。卸载过程会关掉服务、删掉程序目录、清掉大部分注册表项,但正如前面说的,设备实例它不管。
卸载完成后不要重启。这一点和很多教程相反,但顺序上必须先做设备管理器。因为一旦重启,Windows 会重新枚举一遍设备,把那些已经没有驱动支撑的实例标成隐藏设备,虽然还能删,但要多绕一步。正确的做法是卸载完立刻开设备管理器,并且先让它把非在用设备显示出来。
:: 让设备管理器显示非在用设备,然后启动 set devmgr_show_nonpresent_devices=1 start devmgmt.mscset这一行只在当前命令行窗口有效,作用是给接下来启动的设备管理器进程传一个环境变量,让它把「曾经装过但现在不在位」的设备也列出来。不设这个变量,那些灰色条目根本不会出现,你会以为已经删干净了。启动之后,在设备管理器里点「查看 → 显示隐藏的设备」再确认一次,两层保险。
然后展开「端口(COM 和 LPT)」,逐个右键卸载 VSPD6.9 留下的虚拟串口,弹出确认框时点是。这里有个硬性纪律:只删实例 ID 是ROOT\开头的条目。主板自带的 COM1 千万别动,删了之后要进 BIOS 或者重装芯片组驱动才能恢复,得不偿失。删完不要刷新,直接进入下一步清注册表。
4.2 注册表三个必查键位与导出备份
设备实例删掉之后,注册表里可能还留着三类东西:软件键、服务键、以及 Enum 分支下沉睡的实例键。挨个查,查到了先导出再删,导出命令 2.2 节已经备过,这里补一份针对性的。
:: 三个位置逐个核对,有输出就记下来 reg query "HKLM\SYSTEM\CurrentControlSet\Services\vspd" /s reg query "HKLM\SYSTEM\CurrentControlSet\Enum\ROOT\PORTS" /s reg query "HKLM\SYSTEM\CurrentControlSet\Control\COM Name Arbiter" /v ComDB第一条查服务键,如果服务还在,说明卸载没清干净,先sc stop vspd再sc delete vspd,把服务摘掉再删键。第二条查 Enum 下的端口实例,正常情况下设备管理器删完这里应该空了,如果还有子键,说明有实例没删掉,回到 4.1 重新走一遍比直接删键安全。第三条查的是 COM 号占用数据库ComDB,这是个二进制值,记录着每个 COM 号被谁占着。
ComDB这一项要特别说:它不要删。删掉之后系统会把所有 COM 号重新洗牌,主板串口、蓝牙虚拟串口、USB 转串口的号全部变,写死端口号的脚本集体罢工。正确姿势是只读不写,发现某个号被残留占用,去设备管理器里给新设备手工指定端口号,让系统自己更新这个数据库。血泪经验:直接清ComDB造成的连锁问题,比 VSPD 残留本身难收拾得多。
软件键在两个位置都查一遍,HKLM\SOFTWARE\Virtual Serial Port Driver和HKLM\SOFTWARE\WOW6432Node\Virtual Serial Port Driver,确认没有子项残留后删掉整个键。
4.3 文件目录、驱动仓库与命令行复核
程序目录通常卸载时会删,但用户配置目录和驱动仓库不一定。先手工核对两个路径:C:\Program Files\Virtual Serial Port Driver(或 x86 那个)和C:\ProgramData\Virtual Serial Port Driver。前者没了就没了,后者经常留着配置文件,删掉不影响系统。
真正容易被漏掉的是驱动仓库。VSPD6.9 的驱动包被 Windows 收进了 DriverStore,就算设备删了、服务删了,驱动包还躺在里面,下次插个同芯片的设备,系统可能又把它装回来。用 pnputil 查。
:: 把驱动仓库清单导出到桌面,用记事本搜 vspd 更快 pnputil /enum-drivers > "%USERPROFILE%\Desktop\pnp_drivers.txt" notepad "%USERPROFILE%\Desktop\pnp_drivers.txt"打开导出的文本,搜vspd或者Virtual Serial,找到对应那一段,记下它的Published Name,形如oemXX.inf,这是系统给这个驱动包的编号。然后删。
:: 把 oemXX.inf 换成上一步实际查到的编号 pnputil /delete-driver oemXX.inf /uninstall /force/uninstall表示顺便卸载正在使用这个驱动的设备,/force表示强制删除,即使有设备还在引用。这两个参数一起用才删得掉 VSPD 这种已经半残的驱动包。删除成功会返回一行确认,失败常见原因是还有设备实例没摘干净,回到 4.1 补一遍。
到这里三层都处理完了,重启。重启后系统会重新枚举设备列表,把不再使用的设备信息清掉。这一步不能省,很多残留项的最终清除就发生在这一次开机枚举里。
5. 避坑与排查:五条清理 VSPD6.9 时绕不开的坎
5.1 卸载向导报「安装源不可用」,重装也装不回去
现象:控制面板点卸载,弹窗说找不到安装源,请插入原始安装介质;想按第 3 章的办法重装,安装包跑到一半也报错退出。原因基本是安装目录被手工删过,或者之前用第三方清理工具扫过一遍,Windows Installer 缓存里的 MSI 记录和实际文件对不上,卸载程序找不到卸载脚本,自然动不了。
解决分两步。先在注册表卸载项里找到 VSPD6.9 那一条,把它的UninstallString复制出来,手动跑一次,看具体报什么错。如果确认是缓存损坏,用系统的「安装和卸载疑难解答」工具修一遍安装记录,再重装。实在修不好,就跳过卸载这一步:手工删掉程序目录,然后直接从 4.1 节的设备管理器开始,把设备实例和服务挨个摘掉,注册表按 4.2 节清。这条路能走通,只是漏项概率高,清完务必按第 6 章的三条命令验一遍。
5.2 设备管理器里删掉的端口,刷新一下又回来
现象:右键卸载虚拟串口,确认,列表里消失了,按 F5 刷新,那两个 COM 口原样回来,删几次回来几次,像没删一样。原因是只删了设备实例,没动服务。VSPD 的后台服务还在跑,每次设备管理器刷新,服务就重新枚举一次,把实例又创建出来。
解决顺序必须是先停服务再删设备。命令行执行sc stop vspd停掉,然后sc config vspd start= disabled把启动类型改成禁用,注意等号后面有个空格。改完再回设备管理器删端口,这次就不会回来了。等确认清干净,最后sc delete vspd把服务项一并删掉。如果服务名不是vspd,用sc query type= service state= all | findstr /i vspd找一下实际名字。
5.3 卸载完了,新模块却抢不到原来的 COM 号
现象:脚本里写死 COM3,VSPD 清干净了,新插的 USB 转串口却被分到 COM7,手动在设备属性里改端口号,下拉列表里 COM3 显示「正在使用中」。原因是 ComDB 这个占用数据库里,COM3 还挂在已经被删掉的设备实例名下,系统不敢把它分配给新设备。
解决不要直接删 ComDB。先去 4.2 节查过的Enum\ROOT\PORTS分支,看看是不是还有残留子键挂着 COM3,有就删掉那个子键再重启。重启后如果还被占,进设备管理器 → 端口 → 新设备属性 → 端口设置 → 高级,把端口号改成 COM3,系统会提示被占用但允许强制分配,点确定即可。强制分配之后 ComDB 会自动更新,比重装系统或者清数据库安全得多。
5.4 手动清注册表之后,开机卡在转圈
现象:为了删干净,直接把HKLM\SYSTEM\CurrentControlSet\Enum下看起来像虚拟串口的项整片删了,重启后系统卡在开机动画,进不去桌面。原因是 Enum 分支下不只有 VSPD 的实例,还混着主板、USB 控制器等关键设备的枚举信息,删错一个就可能导致驱动加载失败。
解决靠 2.2 节的备份。进安全模式或者用 PE 启动,把enum_root_backup.reg导回去,重启就能恢复。恢复之后重新来一遍,这次严格只删Enum\ROOT\PORTS下确认属于 VSPD 的子键,拿不准就留着,用设备管理器删比手删安全。从那以后我动 Enum 分支前,导出备份这一步从来没省过。
5.5 旧驱动在较新系统上被签名拦下
现象:重装 VSPD6.9 到一半,弹出驱动无法安装,提示签名验证失败,安装程序回滚。原因是 6.9 这个版本的驱动签名证书比较老,在较新的系统版本上不再被默认信任。
解决是临时关闭驱动签名强制。设置 → 系统 → 恢复 → 高级启动 → 立即重新启动,进高级选项 → 启动设置 → 重启,按提示选择「禁用驱动程序强制签名」那一条,进系统后再装,装完正常重启一次就恢复默认策略。注意这只是临时关闭,重启后自动还原,不要用命令永久关掉,那会让整台机器的驱动安全策略失效。
6. 验证清理结果:三条命令确认 VSPD6.9 和虚拟串口都不在了
清理完重启,别急着装新东西。用一段脚本把三个层面一次过完,比在设备管理器里翻半天靠谱。
# 三层一起验:设备实例、服务、软件注册键 $ports = Get-PnpDevice -Class Ports -ErrorAction SilentlyContinue | Where-Object { $_.InstanceId -like "ROOT\*" } "ROOT 虚拟端口数量: $($ports.Count)" $svc = Get-Service -Name "vspd*" -ErrorAction SilentlyContinue if ($svc) { $svc | Format-Table Name, Status, StartType } else { "服务: 无残留" } $sw = Get-ItemProperty "HKLM:\SOFTWARE\WOW6432Node\Virtual Serial Port Driver" -ErrorAction SilentlyContinue if ($sw) { "注册表软件键: 仍存在" } else { "注册表软件键: 已清除" }第一行数ROOT\开头的端口设备,期望结果是 0;如果不是 0,说明还有实例没摘,回 4.1 补。第二行查服务,期望输出「无残留」;如果还列出服务但状态是 Stopped、启动类型 Disabled,说明键还在,sc delete vspd删掉再验。第三行查软件注册键,期望「已清除」。
| 检查项 | 命令入口 | 干净的标准 |
|---|---|---|
| 设备实例 | Get-PnpDevice -Class Ports | 无 ROOT\ 开头的条目 |
| 后台服务 | Get-Service -Name "vspd*" | 查询结果为空 |
| 软件注册键 | reg query "HKLM\SOFTWARE\WOW6432Node\Virtual Serial Port Driver" | 提示找不到指定的注册表项 |
| 驱动包 | pnputil /enum-drivers | 清单里搜不到 vspd |
最后一步是实测:把之前打不开的 USB 转串口插上,打开设备管理器看它能不能拿到期望的 COM 号,再用串口调试工具发一串数据,确认收发正常。这一步才是真正的验收,前面所有命令都只是纸面干净。
从那以后我每次清理这类驱动残留,都强制走一遍「先记基线、再装回去重置、三层剥离、最后三条命令验」的流程,哪怕看起来只删了个把端口也不跳步。虚拟串口这东西出问题不报警,等你发现的时候往往已经在产线或者客户机器上炸了。希望帮到你。
本文还有配套的精品资源,点击获取