
嵌入式开发这行干久了你会发现一个很有意思的现象真正让人抓狂的往往不是那些复杂的算法或者晦涩的寄存器配置而是一些看起来特别基础、特别不起眼的小环节。串口调试就是其中最典型的一个。你手头可能只有一块STM32开发板但代码里需要同时跑三路串口通信——一路接GPS模块一路接上位机协议还有一路留给调试打印。物理串口不够用怎么办这时候虚拟串口软件就派上用场了。VSPDVirtual Serial Port Driver7.2版是我在Windows平台上用得最顺手的一款虚拟串口工具它能在系统里凭空创建出一对相互绑定的COM端口往一个口写数据另一个口就能读到完美模拟真实串口的通信行为。这篇内容我会把VSPD 7.2的安装、配置、调试全流程拆开讲清楚同时把嵌入式开发中串口调试的实战技巧一并奉上不管你是刚接触嵌入式的新手还是已经画过几块板子的老手都能从中找到可以直接用的东西。1. 虚拟串口到底解决了嵌入式开发中的哪些实际问题1.1 物理串口不够用是常态而非例外做过STM32或者嵌入式Linux开发的人应该都有体会一块MCU上能用的UART资源就那么几路。以STM32F407为例它虽然有6个USART/UART但实际项目中引脚复用冲突、DMA通道分配、中断优先级安排这些问题一叠加真正能腾出来做调试输出的往往只剩一路。而你的系统可能需要同时和多个外设通信一个串口屏、一个4G模块、一个指纹识别模块再加上调试打印口需求轻松超过硬件能提供的数量。传统的做法是反复插拔杜邦线或者搞一个笨重的多路串口扩展板。前者效率极低后者增加成本还占地方。虚拟串口软件的思路完全不同——它在操作系统层面模拟出串口设备应用程序以为自己在操作真实的COM口实际上数据只是在内存或者本地回环中流转。VSPD就是干这个的它创建的是成对的虚拟串口比如COM10和COM11绑定在一起你往COM10发数据COM11就能收到反过来也一样。这个机制在嵌入式开发中有几个非常实在的用途。第一你可以在没有物理串口硬件的情况下调试上位机软件。比如你写了一个Qt串口助手想测试它的收发逻辑直接用VSPD建一对口一端接你的助手另一端接一个脚本模拟设备回复整个调试过程不需要任何硬件。第二你可以把真实串口的数据转发到虚拟串口上实现串口数据分流。第三在多机通信模拟中你可以创建多对虚拟串口在一台电脑上模拟整个RS485总线上的多个节点。1.2 虚拟串口和USB转串口是两回事这里有一个概念需要澄清很多初学者会把虚拟串口和USB转串口芯片比如CH340、CP2102、FT232混为一谈。USB转串口是硬件方案你插上一个USB转TTL模块系统里多出来一个COM口这个COM口背后对应着真实的物理引脚TX和RX。虚拟串口是纯软件方案系统里多出来的COM口背后没有任何硬件数据发出去之后要么被配对的另一个虚拟口接收要么被重定向到其他地方。理解这个区别很重要因为它决定了你什么时候该用哪种方案。如果你需要和真实的外部设备通信那必须用USB转串口或者板载的串口。如果你只是想在软件层面模拟串口通信、测试协议解析、做数据回环验证那虚拟串口是更轻量、更灵活的选择。VSPD属于后者它不替代硬件而是在硬件不够或者不方便的时候给你提供一个软件层面的补充。还有一点值得注意VSPD创建的虚拟串口对在设备管理器中是看不到的它不出现在端口(COM和LPT)分类下。你需要在VSPD软件自己的界面里管理这些虚拟端口。这一点和USB转串口不同后者插上就能在设备管理器里看到。很多新手第一次用VSPD时会去设备管理器里找新创建的COM口找不到就以为安装失败了其实不是。1.3 哪些开发场景最适合用VSPD从我的实际经验来看以下几类场景用VSPD的收益最高上位机协议调试你负责写PC端的串口通信程序但硬件同事的板子还没调通。用VSPD建一对口自己写一个简单的Python脚本模拟下位机的回复上位机的收发逻辑、超时重传、粘包处理都能提前验证。多串口应用开发你的嵌入式程序需要同时管理多个串口但手头只有一块板子。用VSPD创建多对虚拟串口配合串口调试助手可以模拟多个设备同时在线的情况。串口数据监控在真实串口和你的应用程序之间插入一对虚拟串口把数据同时转发给监控工具实现不干扰正常通信的前提下抓包分析。教学和演示给学生或者同事演示串口通信原理时不需要人手一套硬件一台电脑装好VSPD就能让所有人动手操作。注意VSPD是Windows平台软件不支持Linux和macOS。如果你在Linux下开发需要用socat或者tty0tty这类工具来创建虚拟串口对原理类似但操作方式不同。2. VSPD 7.2的安装过程与容易卡住的环节2.1 安装前的系统检查和准备工作VSPD 7.2对Windows版本有要求它支持Windows 7到Windows 11的各个版本包括32位和64位。在安装之前有几件事建议先确认一下。首先检查你的系统里有没有已经安装过其他虚拟串口软件。有些蓝牙驱动、手机助手类软件也会创建虚拟COM口如果之前装过类似的工具可能会和VSPD产生冲突。建议在安装VSPD之前先打开设备管理器展开端口(COM和LPT)看看当前有哪些COM口被占用。把当前端口列表截图保存安装完VSPD之后再对比这样能清楚知道VSPD创建了哪些新端口。其次VSPD安装需要管理员权限。如果你用的是公司电脑IT策略可能限制了驱动安装这种情况下需要提前和IT部门沟通。安装过程中会安装一个内核态的驱动程序这是VSPD能创建虚拟串口的基础。这个驱动在安装时可能会触发Windows的数字签名验证正常情况下VSPD 7.2的驱动是带签名的但如果你用的是特别老的版本或者修改版可能会遇到签名问题。还有一点安装VSPD之前建议关闭所有正在使用串口的程序。串口调试助手、Arduino IDE、Keil的调试窗口这些都可能占用COM口资源。虽然VSPD安装时不一定需要独占所有串口但关闭它们能减少安装过程中出现意外提示的概率。2.2 逐步安装与驱动签名处理VSPD 7.2的安装包通常是一个exe文件双击运行后会看到安装向导。整个安装过程比较标准但有几个地方需要留意。第一步是选择安装路径。默认路径是C:\Program Files (x86)\Virtual Serial Port Driver或者对应的64位路径。建议保持默认不要安装到中文路径或者带空格的路径下虽然7.2版本对中文路径的兼容性已经好了很多但避免不必要的麻烦总是好的。第二步是驱动安装确认。安装程序会提示将要安装虚拟串口驱动点击安装或者继续。这时候Windows可能会弹出Windows安全中心的对话框提示Windows无法验证此驱动程序软件的发布者。这是正常的因为VSPD的驱动虽然签名了但可能不是微软WHQL认证的。点击始终安装此驱动程序软件即可。如果你在Windows 10或Windows 11上安装时遇到驱动签名强制拦截导致安装失败可以尝试以下操作按住Shift键点击重启进入高级启动选项选择禁用驱动程序强制签名模式然后重新安装VSPD。安装完成后再正常重启驱动就能正常加载了。不过要注意这种方法在部分企业管控的电脑上可能不适用。第三步是等待安装完成。安装过程通常很快一两分钟就能搞定。安装完成后建议重启一次电脑虽然安装程序可能不强制要求重启但重启能确保驱动正确加载。2.3 安装后的验证确认虚拟串口驱动正常工作安装完成后怎么确认VSPD已经正常工作了呢最直接的方法是打开VSPD软件本身。如果软件能正常启动界面左侧的Serial ports列表里能看到当前系统已有的COM口那就说明基本没问题了。更进一步的验证是创建一个测试用的虚拟串口对。在VSPD界面中从左侧列表选一个未被占用的COM口比如COM10从右侧列表选另一个比如COM11点击Add pair按钮。如果创建成功这对端口会出现在下方的Virtual serial ports列表中。这时候你可以打开设备管理器虽然虚拟串口不会出现在端口(COM和LPT)分类下但你可以用串口调试助手来验证。打开两个串口调试助手实例一个打开COM10另一个打开COM11从COM10发送数据如果COM11能收到说明虚拟串口对工作正常。提示如果创建虚拟串口对时提示Port already in use或者Access denied通常是因为你选择的COM口编号已经被其他程序占用了。换一个编号试试比如从COM20开始往后选这些高编号的端口一般不会被系统或其他软件占用。3. 创建和管理虚拟串口对的核心操作3.1 端口配对逻辑与编号选择策略VSPD的核心功能就是创建成对的虚拟串口。为什么必须是成对的因为串口通信本质上是两个端点之间的数据交换。一个虚拟串口如果单独存在没有配对的另一端那数据发出去就无处可去就像对着空气说话。成对创建之后两个端口之间建立了一条虚拟的连接通道数据从一端进从另一端出模拟了真实串口通过TX/RX交叉连接的效果。在编号选择上VSPD允许你从COM1到COM255之间任意选择。但有几个原则需要遵守。第一避开系统已经占用的低编号端口。COM1到COM4通常被主板保留或者被某些驱动占用不建议使用。第二避开你实际会用到的物理串口编号。比如你的USB转串口模块通常被识别为COM3或者COM5那你就不要用这些编号来创建虚拟串口否则会冲突。第三建议从COM10或者COM20开始使用这些编号在大多数系统上都是空闲的。一个比较实用的做法是建立自己的编号规范。比如COM10和COM11作为第一对COM12和COM13作为第二对以此类推。这样在代码里或者调试助手里选择端口时不容易搞混。我在做多串口项目时习惯把偶数编号给上位机程序用奇数编号给模拟设备用这样一眼就能看出数据流向。3.2 批量创建多对虚拟串口的操作细节实际项目中往往需要不止一对虚拟串口。比如你要模拟一个RS485总线上的三个节点那就需要至少三对虚拟串口。VSPD支持批量创建操作也不复杂。在VSPD主界面中你可以依次选择端口对然后点击Add pair。每创建一对它们就会出现在下方的列表中。创建多对时要注意每对之间的编号不能重叠。比如第一对用了COM10和COM11第二对就不能再用这两个编号得从COM12开始。创建完成后VSPD的界面会列出所有虚拟串口对。你可以给每对端口添加备注比如GPS模拟、上位机通信、调试打印这样在管理多个端口时一目了然。VSPD 7.2支持保存配置下次打开软件时之前的虚拟串口对会自动恢复不需要重新创建。有一个细节值得注意VSPD创建的虚拟串口对在系统重启后是否保留取决于软件的设置。默认情况下VSPD会在系统启动时自动恢复之前创建的端口对。但如果你在软件里手动删除了某对端口那重启后就不会再出现。如果你希望某些端口对永久保留可以在创建后不要删除让VSPD自己管理。3.3 删除、修改与端口冲突处理删除虚拟串口对很简单在VSPD界面中选中要删除的端口对点击Delete pair即可。删除后这对COM口编号就释放出来了可以被其他程序或者新建的虚拟串口对使用。但有时候你会遇到删除失败的情况。最常见的原因是这对虚拟串口正在被某个程序占用。比如你的串口调试助手还开着COM10这时候去VSPD里删除COM10和COM11的配对就会提示失败。解决办法是先关闭所有打开了这些COM口的程序然后再删除。端口冲突是另一个常见问题。假设你创建了COM10和COM11的配对然后插上了一个USB转串口模块系统恰好把那个模块也识别为COM10。这时候就会冲突。VSPD会提示端口被占用或者虽然创建成功但实际通信异常。处理方法是修改USB转串口模块的端口号在设备管理器中右键该设备选择属性→端口设置→高级然后在下拉框里换一个未被使用的COM口编号。还有一种情况是你之前用某个COM口编号创建过虚拟串口对后来删除了但系统里还残留着注册表信息导致重新创建时提示冲突。这时候可以尝试重启电脑或者用VSPD自带的清理功能清除残留配置。4. 用虚拟串口搭建完整的串口调试环境4.1 串口调试助手的选择与配置要点虚拟串口创建好之后你需要一个串口调试工具来收发数据。市面上常见的串口调试助手有SSCOM、XCOM、友善串口调试助手等功能大同小异选一个自己顺手的就行。SSCOM是我用得比较多的一款它支持多窗口、支持HEX和ASCII切换、支持定时发送、支持数据保存。配置的时候有几个参数需要和你的虚拟串口匹配波特率、数据位、停止位、校验位。虚拟串口对这些参数的处理方式和真实串口略有不同——因为虚拟串口没有实际的物理层波特率等参数实际上不会影响数据传输速率数据是立即从一端传到另一端的。但为了模拟真实场景建议还是按照你的实际项目设置相同的参数比如115200-8-N-1。在SSCOM中打开虚拟串口时如果端口列表里找不到你创建的COM口点击刷新按钮通常就能看到。如果还是找不到检查VSPD软件是否正在运行因为虚拟串口是由VSPD的驱动动态创建的VSPD没运行的话端口可能不存在。XCOM是另一款常用的工具它的界面更简洁适合快速测试。友善串口调试助手则支持脚本功能可以自动回复特定数据在做协议模拟时特别方便。你可以根据自己的需求选择也可以同时装几个不同场景用不同的工具。4.2 回环测试验证虚拟串口通信是否正常创建好虚拟串口对之后第一件事应该是做回环测试确认通信链路是通的。具体操作是打开两个串口调试助手实例一个打开COM10另一个打开COM11波特率等参数设置一致。在COM10的发送区输入Hello点击发送如果COM11的接收区显示出Hello说明这对虚拟串口工作正常。这个测试看起来简单但能排除很多问题。如果COM11收不到数据可能的原因有几个一是两个调试助手打开的端口没有正确配对比如一个开了COM10另一个开了COM12那肯定收不到二是其中一个调试助手没有正确打开端口虽然界面上显示已打开但实际上被其他程序占用了三是VSPD的虚拟串口对没有真正建立需要回到VSPD界面确认。回环测试通过之后你可以进一步测试HEX模式。在发送区输入十六进制数据比如01 03 00 00 00 01 84 0A这是Modbus RTU协议中常用的读取保持寄存器的请求帧。接收端如果能在HEX模式下正确显示这些字节说明虚拟串口对二进制数据的透传也是没问题的。4.3 模拟下位机用脚本自动回复数据回环测试只能验证链路通畅但实际调试中你往往需要模拟一个真实的下位机设备它能根据收到的指令返回相应的数据。这时候可以用Python脚本来实现。Python的pyserial库可以打开虚拟串口并收发数据。下面是一个简单的Modbus RTU从站模拟脚本import serial import time # 打开虚拟串口COM11参数与上位机一致 ser serial.Serial(COM11, 115200, timeout1) # 预定义的寄存器值 registers [0x0064, 0x00C8, 0x012C, 0x0190] while True: # 读取上位机发来的数据 data ser.read(8) if len(data) 8: # 解析Modbus RTU请求帧 addr data[0] func data[1] start_reg (data[2] 8) | data[3] reg_count (data[4] 8) | data[5] if func 0x03: # 读取保持寄存器 # 构造响应帧 resp [addr, func, reg_count * 2] for i in range(reg_count): val registers[start_reg i] resp.append((val 8) 0xFF) resp.append(val 0xFF) # 计算CRC16 crc 0xFFFF for b in resp: crc ^ b for _ in range(8): if crc 1: crc (crc 1) ^ 0xA001 else: crc 1 resp.append(crc 0xFF) resp.append((crc 8) 0xFF) ser.write(bytes(resp)) time.sleep(0.01)这个脚本打开COM11监听上位机通过COM10发来的Modbus请求解析后返回对应的寄存器值。上位机程序完全感知不到对面是一个脚本而不是真实设备这就是虚拟串口的价值所在。提示运行Python脚本之前确保pyserial已经安装用pip install pyserial即可。另外脚本中打开的COM口号要和VSPD中创建的虚拟串口对匹配不要搞反了方向。5. 嵌入式开发中串口调试的实战技巧5.1 STM32串口初始化的常见配置陷阱虚拟串口环境搭好之后最终还是要回到真实的嵌入式开发中。STM32的串口初始化看起来简单但有几个地方特别容易出问题。第一个是波特率计算。STM32的USART波特率计算公式是baud fCK / (16 * USARTDIV)其中USARTDIV是一个定点数整数部分和小数部分分别配置在BRR寄存器的不同位段。如果你用的是标准库或者HAL库通常只需要调用HAL_UART_Init()并传入波特率值库函数会自动计算。但如果你直接操作寄存器就需要自己算。比如系统时钟84MHz要得到115200的波特率USARTDIV 84000000 / (16 * 115200) 45.5729。整数部分是45小数部分是0.5729 * 16 9.17取整为9。所以BRR寄存器应该配置为(45 4) | 9。第二个是GPIO复用配置。STM32的USART引脚需要配置为复用推挽输出TX和浮空输入或上拉输入RX。很多人忘记开启GPIO的复用功能时钟或者把TX配置成了普通推挽输出结果串口就是没反应。正确的做法是使能GPIO时钟和USART时钟然后把TX引脚配置为GPIO_Mode_AF_PPRX引脚配置为GPIO_Mode_IN_FLOATING或GPIO_Mode_IPU。第三个是中断优先级。如果你用中断方式接收串口数据NVIC的优先级配置要注意。STM32F407的HAL库默认把串口中断优先级设为0如果你的系统里还有其他中断比如定时器中断、DMA中断就需要合理分配优先级避免串口中断被长时间阻塞导致数据丢失。5.2 用DMA空闲中断实现不定长数据接收串口接收不定长数据是嵌入式开发中的经典问题。传统的做法是每收到一个字节就进一次中断在中断里判断帧头帧尾效率低且占用CPU。更好的方案是DMA空闲中断。具体思路是配置DMA接收串口数据DMA在后台自动把串口数据搬运到缓冲区不需要CPU干预。同时开启串口的空闲中断IDLE当串口总线空闲时即一帧数据接收完毕触发空闲中断。在空闲中断中读取DMA当前搬运的数据量就能知道这一帧数据有多长然后处理数据并重新启动DMA接收。这个方案的好处是CPU占用极低而且能可靠地接收不定长数据。在STM32F407上配置的步骤大致如下初始化DMA通道设置外设地址为USART的DR寄存器内存地址为接收缓冲区传输方向为外设到内存模式为循环模式。然后在USART的CR1寄存器中开启IDLEIE位。在USART的中断服务函数中判断IDLE标志清除标志后计算接收长度。实际使用中有一个坑需要注意DMA的循环模式和空闲中断配合时如果数据帧特别长超过了DMA缓冲区的长度DMA会回绕覆盖之前的数据。所以缓冲区要设置得足够大或者用双缓冲机制。另外空闲中断的清除需要先读SR寄存器再读DR寄存器这个顺序不能错否则中断会反复触发。5.3 串口数据抓包与协议分析的实用方法在调试串口通信协议时光看收发数据往往不够你需要分析数据帧的结构、时序、错误情况。这时候可以借助虚拟串口来做数据抓包。具体做法是在你的应用程序和真实串口之间插入一对虚拟串口。应用程序打开虚拟串口的一端另一端由一个转发程序打开转发程序同时打开真实串口。转发程序负责在虚拟串口和真实串口之间双向转发数据同时把经过的数据打印出来或者保存到文件。这样你的应用程序完全不知道中间多了一层而你可以看到所有收发的原始数据。用Python实现这个转发程序很简单用pyserial打开两个串口然后开两个线程分别做单向转发。在转发过程中把数据写入日志文件加上时间戳方便后续分析。如果需要分析协议时序还可以记录每个字节的到达时间计算帧间隔。对于Modbus、自定义二进制协议这类应用建议在转发程序中加入简单的协议解析逻辑把原始字节流解析成可读的帧结构比如地址: 0x01, 功能码: 0x03, 数据: ...。这样分析起来比看一堆十六进制数字直观得多。5.4 串口通信中的常见故障与排查思路串口通信出问题的时候排查思路很重要。我一般按照从物理层到应用层的顺序来查。物理层先确认接线。TX要接RXRX要接TXGND要共地。这是最基础的但也是最容易出错的。特别是用杜邦线连接的时候线序搞反是家常便饭。用万用表量一下通断确认线没断。然后确认波特率。两边的波特率必须一致115200对9600肯定收不到正确数据。如果波特率一致但收到乱码可能是时钟配置有问题。比如STM32的外部晶振是8MHz但代码里配置成了12MHz那实际波特率就会偏差很大。可以用示波器量一下TX引脚上的波形测量一个位的宽度反推实际波特率。数据格式也要检查。数据位、停止位、校验位必须匹配。常见的配置是8-N-1但有些设备用7-E-1或者8-O-1。如果格式不匹配收到的数据会错位。如果物理层和配置都没问题但数据还是不对那就要看软件层面了。检查发送缓冲区是否溢出接收中断是否及时处理DMA配置是否正确。用调试器单步跟踪或者在关键位置加打印看看数据到底在哪一步出了问题。虚拟串口在这里也能帮上忙。你可以用虚拟串口替代真实串口排除硬件问题。如果虚拟串口下通信正常换成真实串口就出问题那基本可以确定是硬件或者底层配置的问题。6. 虚拟串口在复杂嵌入式项目中的进阶用法6.1 多节点RS485总线模拟RS485总线通常是一主多从的结构主机轮询各个从机从机收到自己的地址才回复。在开发阶段你可能只有一个真实的从机设备但协议要求你测试多个从机的场景。这时候虚拟串口就能派上用场。你可以创建多对虚拟串口每对模拟一个从机。比如COM10/COM11模拟从机1COM12/COM13模拟从机2COM14/COM15模拟从机3。主机程序通过一个真实的USB转485模块连接到总线同时用另外的虚拟串口对来模拟从机。每个从机用一个Python脚本实现监听自己的虚拟串口收到主机轮询后判断地址是否匹配匹配则回复数据。这种模拟方式的好处是你可以在没有足够硬件的情况下验证主机程序的轮询逻辑、超时处理、异常恢复等。而且每个从机的行为都可以用脚本精确控制比如模拟某个从机偶尔不回复测试主机的超时重试机制。6.2 串口数据转发与协议转换验证在实际项目中经常需要做协议转换。比如设备端用Modbus RTU但上位机用MQTT中间需要一个网关做转换。网关的开发和调试就可以用虚拟串口来辅助。你可以用虚拟串口模拟设备端的串口输出网关程序从虚拟串口读取Modbus数据转换成MQTT消息发布。同时用另一个虚拟串口模拟MQTT Broker的响应验证网关的订阅和下发逻辑。整个测试过程不需要真实的设备也不需要真实的MQTT服务器全部在本地完成。这种方式的另一个好处是可控性强。你可以精确控制设备端发送的数据内容和时机测试网关在各种边界条件下的表现。比如发送一个超长的Modbus帧看网关是否正确处理或者发送一个CRC错误的帧看网关是否丢弃。6.3 与嵌入式Linux开发的配合使用虽然VSPD是Windows软件但在嵌入式Linux开发中虚拟串口的思路同样适用。Linux下可以用socat创建虚拟串口对socat -d -d pty,raw,echo0 pty,raw,echo0这条命令会创建两个伪终端pty它们之间是配对的。命令输出会显示两个设备路径比如/dev/pts/2和/dev/pts/3。你可以把这两个路径当作串口设备来使用用minicom或者screen打开其中一个往另一个写数据。在嵌入式Linux开发中这种虚拟串口常用于测试串口应用程序。比如你写了一个读取串口数据的守护进程可以在开发机上用虚拟串口先验证逻辑然后再部署到目标板上。CLion或者VSCode配合远程调试可以很方便地在开发机上跑虚拟串口测试在目标板上跑真实串口。6.4 虚拟串口在自动化测试中的角色自动化测试是虚拟串口最能发挥价值的地方之一。你可以把虚拟串口的创建、测试脚本的执行、结果的验证全部自动化。比如用Python的pyserial和VSPD的命令行工具如果版本支持写一个测试脚本自动创建虚拟串口对启动模拟从机的脚本运行上位机测试程序收集测试结果最后清理虚拟串口。整个过程不需要人工干预可以集成到CI/CD流程中。对于STM32开发你还可以结合单元测试框架在PC上编译运行部分协议解析代码用虚拟串口喂入测试数据验证解析逻辑的正确性。这种PC端单元测试目标板集成测试的组合能大幅提高代码质量和开发效率。7. 关于VSPD使用中的一些经验之谈VSPD这个工具我从早期版本用到现在踩过的坑不算少这里分享几个比较实用的经验。第一虚拟串口的编号不要贪低。很多人习惯从COM1、COM2开始创建觉得编号小好记。但COM1到COM4在Windows系统里往往被保留或者被其他驱动占用用这些编号容易出问题。从COM10或者COM20开始基本不会遇到冲突。第二VSPD创建的虚拟串口对在系统重启后有时会丢失特别是Windows自动更新之后。如果你有固定的调试环境建议把VSPD的配置导出保存重启后如果发现端口不见了导入配置就能恢复。另外把VSPD加入开机启动项能减少手动操作的麻烦。第三虚拟串口虽然方便但不能完全替代真实串口。有些底层的问题比如电平匹配、信号完整性、电磁干扰只有在真实硬件上才能暴露出来。我的做法是协议逻辑和上层应用用虚拟串口调试底层驱动和硬件相关的问题必须在真实串口上验证。两者结合效率最高。第四如果你在团队里推广虚拟串口方案建议统一端口编号规范。比如约定COM10-COM19用于调试COM20-COM29用于模拟设备。这样在代码审查和问题排查时大家看到端口号就知道用途减少沟通成本。最后说一个容易被忽略的点虚拟串口的性能。虽然虚拟串口的数据传输不经过物理层但数据仍然要在内核态和用户态之间拷贝。如果你用虚拟串口做高速数据传输测试比如1Mbps以上的波特率可能会遇到缓冲区溢出或者延迟增大的情况。这种场景下适当增大串口驱动的缓冲区大小或者在应用层做流控能改善性能。不过对于大多数嵌入式调试场景115200的波特率完全够用虚拟串口的性能绰绰有余。