2026/9/25 1:21:44

J-Link V9虚拟串口实战:一根USB线搞定SWD调试和串口日志

J-Link V9虚拟串口实战:一根USB线搞定SWD调试和串口日志 干嵌入式这行桌上最不缺的就是线。以前我每次调试一块新板子至少要拖两根USB线一根给J-Link做SWD下载调试另一根给USB转TTL模块看串口日志桌面乱不说出差时少带一根线就是一场灾难。直到一次临时去现场调试我只带了一个J-Link V9才认真研究起它的虚拟串口VCOM功能——原来SWD调试和串口通信可以走同一根USB线电脑上会出现一个额外的COM口目标板的printf日志直接从J-Link的TXD/RXD引脚出来。这篇文章就把我折腾V9虚拟串口的过程、踩过的坑、接线方法和固件问题一次说清楚让你也能一根线同时搞定调试和通信。1. JLink V9的虚拟串口到底是个什么东西1.1 一个盒子里装了两个角色J-Link V9在嵌入式调试里最常见的身份是SWD/JTAG调试器负责给STM32这类MCU下载程序、在线调试。但它内部的主控芯片一般是STM32F205或F207本身带有USB控制器SCGGER的官方固件把其中一个USB接口做成了CDC类设备。CDC类的全称是Communications Device Class通俗说就是让USB设备在电脑里被识别成传统串口应用软件完全感知不到USB的存在直接像操作COM口一样收发数据。所以当你把一个固件完整、支持虚拟串口的J-Link V9插上电脑装好驱动之后设备管理器里会出现两个设备一个是“J-Link”调试器本体另一个是“J-Link CDC UART Port (COMx)”。这个COM口不是USB转TTL模块那样额外占一个USB口而是和调试器共用同一条USB线缆在JTAG/SWD排线上引出TXD和RXD两个引脚给目标板。1.2 它和USB转TTL的本质区别USB转TTL模块比如常见的CH340、CP2102、FT232方案本质上是一个“USB转UART桥接芯片”它的物理接口只有收发数据这一件事跟调试器完全不沾边。J-Link V9虚拟串口的底层虽然也是USB CDC协议但它背后是调试器主控芯片直接驱动引脚的相当于把调试器和串口桥接器这两个功能熔进了同一个主控里。用的时候区别也很直接USB转TTL模块需要单独给电脑留一个USB口J-Link虚拟串口不占用额外USB资源USB转TTL的电平通常由模块自己决定常见3.3V或5V跳线而J-Link虚拟串口的RXD/TXD电平是“跟随目标板参考电压”的这个细节影响很大后面接线部分我会展开说。另外J-Link虚拟串口的数据通路其实是经过调试器主控中转的在某些固件版本下目标板复位或进入低功耗模式时COM口的数据可能出现延迟或短暂中断这一点跟硬件直连的USB转TTL模块不太一样。1.3 能扛住的场景和扛不住的场景先说能替代的场景日常开发阶段看日志、打印调试信息、下发命令、跟MCU做简单的数据交换虚拟串口完全够用尤其适合只带一台笔记本去现场、不想多背一个模块的场景。我做过一个手持设备项目板子上没有USB口只留了SWD和UART测试点用一根J-Link V9全搞定下载、断点调试、同时看设备上报的传感器数据体验比带两个工具还顺手。扛不住的场景也有几类第一是高速串口通信虚拟串口在115200以下非常稳但上到460800甚至921600时某些V9固件的数据中转能力会吃紧丢包率明显上升这类场景我建议换原生USB转TTL模块第二是电平不匹配的场景V9的虚拟串口电平跟随VTref如果目标板是5V系统可能没法直接用第三是隔离需求比如需要隔离的工业现场或高压侧通信J-Link虚拟串口没有隔离能力肯定得换专门的隔离型USB转串口模块。2. 动手前先确认你的V9支持虚拟串口吗2.1 原装和克隆版本怎么辨认J-Link V9在市面上流通了很长时间原装SEGGER版本和后来大量出现的兼容版很多人叫“克隆版”或“山寨版”都有。原装V9基本都支持虚拟串口因为SEGGER官方固件里包含VCOM功能。兼容版就得看具体固件和硬件设计了有一部分兼容版为了节约成本或者没搞定CDC驱动直接砍掉了虚拟串口也有一部分兼容版用的是完整固件功能和原装几乎一样。怎么快速判断先把V9插电脑装完SEGGER官方驱动后打开设备管理器展开“端口(COM和LPT)”这个分类如果能看到“J-Link CDC UART Port (COMx)”说明你的V9支持虚拟串口。如果只有“J-Link”设备、没有COM口那基本就是固件不带VCOM功能或者硬件上根本没把TXD/RXD引脚引出来。再从外观上看有些兼容版J-Link在20针排针旁边会额外预留一组4Pin插针或者6Pin插针丝印上写着TXD、RXD、GND、VCC之类的字样这种通常就是把虚拟串口引脚引出来的设计非常直观。2.2 固件不对怎么办614e.hex那些事如果你的V9插上之后没有COM口先别急着认定它硬件阉割很大概率是固件不是完整版。V9的硬件核心大多是STM32F205/207只要主控没被换刷回完整固件就能找回虚拟串口。圈子里流传比较广的一个固件文件是“614e.hex”对应SEGGER一个历史版本的V9固件很多老工程师就是靠它把被商家刷过精简固件的V9救回来。刷写前一定要确认主控型号拆开外壳看芯片丝印F205或F207都行。刷写流程我实际操作过几次一般是按住J-Link板上的BOOT按键再插入USB让STM32进入DFU模式然后打开STM32CubeProgrammer选择USB DFU连接方式把614e.hex烧进去。需要注意DFU模式下电脑会认出一个“STM32 Bootloader”设备需要在设备管理器里确认识别到了再刷。刷完固件拔下来重新插SEGGER驱动会重新识别设备这时候设备管理器里大概率就多出“J-Link CDC UART Port (COMx)”了。提示刷固件存在一定风险DFU刷写时电脑断电、USB线质量太差或下载到一半拔线都可能导致V9变砖。刷之前确保数据线是能传数据的不是只能充电的线。2.3 驱动和工具链准备虚拟串口的驱动分两层第一层是SEGGER调试器驱动也就是J-Link安装包里的驱动它负责让Windows识别“J-Link”设备本身第二层是USB CDC虚拟串口驱动Windows 10和Windows 11系统通常自带插上就能用但有些精简版系统或老旧Windows 7系统需要手动安装驱动。我建议直接安装最新版的SEGGER J-Link Software Pack装完驱动和附带的J-Link Commander、J-Flash等工具就都有了。驱动装好后再验证一下打开J-Link Commander安装目录下叫JLink.exe连接你的V9在命令行里输入vcom enable有些固件版本默认就是开启的输入这条命令会返回状态然后打开设备管理器看是否出现COM口。如果你的固件版本比较老可能没有这个命令那就以设备管理器里有没有“J-Link CDC UART Port”为准。工具链方面串口调试助手我用过的不下十种SSCOM、PUTTY、Xshell的串口模式、VSCode的Serial Monitor插件都行本质都是打开对应COM口设置波特率即可后面实操部分再细说。3. 启用虚拟串口让电脑认出一个新COM口3.1 Windows下从设备管理器确认CDC设备把支持VCOM的J-Link V9插上电脑正常情况下稍等几秒设备管理器里会有动静。展开“端口(COM和LPT)”能看到类似“J-Link CDC UART Port (COM5)”这样的条目COM编号根据你机器上已有的串口号动态分配每次插拔可能会变所以写串口工具配置脚本或程序时最好动态匹配设备描述而不是写死COM5。如果没有出现先拔插一次换一个USB口有时USB口供电不稳或驱动枚举冲突会导致CDC设备不出现。再不行就看看“通用串行总线设备”或“其他设备”分类里有没有带黄色感叹号的项有的话右键更新驱动手动指向SEGGER安装目录里的驱动文件。我在Windows 11上遇到过Windows自动更新把驱动搞乱的情况解决办法是把设备卸载勾选“删除此设备的驱动程序软件”然后重新插拔让它自动装。3.2 用J-Link Commander验证VCOM状态分不清COM口是虚拟串口还是别的设备时直接命令行验证最靠谱。打开命令行将目录切到SEGGER J-Link安装目录运行JLink.exe会进入一个交互式命令行。连接V9后会提示输入目标设备型号随便选一个或者直接输入目标芯片型号都行。然后在JLink命令行里输入vcom enable正常情况下它会返回当前VCOM开启状态。再配合设备管理器刷新COM口就会立即出现或消失这样就能100%确定VCOM功能在固件层面是正常的。这里提一个细节J-Link Commander在连接目标板之前会先枚举USB设备如果你插了多个J-Link或者USB设备列表里有其他仿真器残留命令行会列出多个SN让你选注意选择对应的序列号即可。VCOM的启用状态在部分固件上会“掉”——就是你这次开了下次插上又没了大概率是固件设置没保存或者你用了精简版固件。遇到这种情况直接在出厂设置里恢复一下J-Link配置再重设VCOM。3.3 常见启用失败的几种情况我遇到过的启用失败基本是这几种一是J-Link固件版本太老老到SEGGER驱动都不认识了这种情况需要先升级固件但升级又报错解法是先刷能识别的中间版本固件再刷最新版有点迂回但有效二是V9的USB连接线是坏的或只供电不传数据换线排查即可三是电脑的USB控制器对CDC类设备支持有问题尤其某些扩展坞或前置USB口供电不稳导致枚举失败换主板原生USB口就好。排查时建议按“换线、换口、换电脑”的顺序试基本能定位到原因。4. 接线是一门学问SWD和UART怎么共用一根排线4.1 SWD三根线真的够吗很多教程说SWD只需要三根线SWDIO、SWCLK、GND也确实能下程序。但加上虚拟串口之后最少得五根线了SWDIO、SWCLK、GND、TXD、RXD。如果还想读取目标板的供电状态VTref检测那最好把VTref也接上。SWDIO和SWCLK接目标板的PA13和PA14STM32的SWD引脚分别对应SWDIO和SWCLKGND要跟目标板共地这一点对虚拟串口尤其重要。有些场景下只接三根SWD线能用但接上串口后如果有数据乱码或通信不稳定十有八九是地没接好。SWD线尽量短我用杜邦线时一般控制15厘米以内线越长SWCLK上的信号边沿退化越明显高速下载时容易报通信失败。如果你用网线或排线连接注意长度同样别太长。4.2 虚拟串口的TXD/RXD到底在哪几个脚上这是新手最容易卡住的地方因为不同版本的V9对VCOM引脚的映射并不统一。我见过两种最常见的设计第一种在20针标准JTAG排针旁边直接做了一组4Pin或6Pin插针丝印标注TXD、RXD、GND、VCC这是最省心的直接照着接就行。第二种20针排针本身复用了TDO、TDI等引脚作为UART信号这种就需要参照你手上V9的具体固件和硬件版本。就我接触过的多数兼容V9和资料来看虚拟串口的TXD信号常出现在20针接口的Pin 11也就是TDO/SWO这一脚RXD信号常出现在Pin 5或Pin 13TDI相关引脚但这并不是一个铁律不同批次甚至不同固件都可能不同。所以最靠谱的办法先看PCB丝印没有丝印就用万用表量或者在J-Link启用了VCOM且串口自发数据时用示波器/逻辑分析仪测候选引脚上的波形。我有一块V9就是丝印模糊最后是拿逻辑分析仪一个个点扫出来的花了十分钟但一劳永逸。还有更简单的验证思路——把目标板串口的TX接到J-Link的候选RXD脚在电脑上用串口助手发数据如果目标板能收到并回显就说明这根线接对了。注意不要拿SWDIOPin 7和SWCLKPin 9去试虚拟串口那两脚是调试专用引脚强接外部串口信号会干扰调试通信甚至可能烧坏调试器IO。4.3 电平匹配与共地问题J-Link V9的IO电平大部分是跟随VTref引脚的这个引脚通常接目标板的3.3V或目标板参考电压所以VCOM输出的高电平大致等于目标板电压对3.3V的STM32来说刚刚好。如果目标板是5V供电系统而J-Link的VTref接的是5V那么虚拟串口的TXD输出高电平也会接近5V此时MCU的RX引脚需要能容忍5V否则建议串一个电阻限流或者加电平转换。反过来如果目标板是1.8V的低压系统J-Link的TXD高电平可能也不匹配需要分压电路。共地问题我再强调一次J-Link和目标板必须共地而且共地点要可靠。虚拟串口的TXD、RXD、SWDIO、SWCLK都是相对GND的电平信号如果不共地不仅串口数据全是乱码SWD通信也可能时好时坏。我之前帮同事排查一个“SWD能连上但串口永远收到0xFF”的问题最后发现是GND杜邦线虚接压紧后一切正常。5. 实操记录给STM32同时跑调试和串口日志5.1 目标板串口初始化与printf重定向以最常见的STM32F103/F407为例我会把USART1的TX和RX分别接到J-Link虚拟串口的RXD和TXD上。注意这里方向是交叉的MCU的TX要接J-Link的RXDMCU的RX要接J-Link的TXD这个“交叉接线”道理跟两个串口设备通信一样但每次画图时总有人接反接反最典型的现象是电脑串口助手完全收不到数据。初始化代码不多说重点是printf重定向。在STM32标准库环境下重写fputc函数就能让printf往串口输出#include stdio.h int fputc(int ch, FILE *f) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) RESET); USART_SendData(USART1, (uint8_t)ch); return ch; }用HAL库的话把发送部分改成HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF);就行。然后在main里初始化USART1波特率先设1152008数据位无校验1停止位这个参数和串口助手保持一致。实际调试时我会把调试信息和业务日志分开比如全部打印到同一个UART口但用不同前缀区分或者用SEGGER RTT这种更高级的方式。不过虚拟串口的价值在于不占额外USB口所以哪怕是只在调试阶段开打印也省了USB转TTL模块的麻烦。5.2 串口助手打开COM口在电脑上打开串口调试助手选择刚才出现的“J-Link CDC UART Port (COMx)”波特率设成115200和数据位、校验位、停止位对齐。点“打开串口”然后复位一下目标板正常情况下就能在接收区看到printf的输出。这里有个经验串口助手打开COM口之后如果你重新插拔J-LinkCOM口号可能会变调试助手里原来选好的端口会失效。建议用支持“刷新端口列表”的工具或者在代码里把串口号打印到调试器输出窗口方便对应。另外有些调试助手会在打开串口时设置DTR/RTS信号而J-Link虚拟串口的DTR/RTS引脚实际上可能没有物理引出不影响基本收发。如果发现收不到数据先检查串口助手有没有选对COM口再检查波特率是否一致然后用万用表量一下MCU的TX引脚上有没有波形。这一步能省掉很多瞎猜时间。5.3 调试器里观察变量和串口数据并行连接V9到目标板后我用Keil MDK或IAR打开工程进入调试模式能在Watch窗口实时看变量值同时串口助手挂在同一个V9虚拟串口上看日志。这样体验最好的是代码跑在一个断点处时串口日志可以把已经执行过的路径完整呈现出来变量值则能反映当前时刻的状态两者对照很多逻辑问题一眼就看到了。再分享一个我常用的骚操作在Keil里把printf重定向到调试器SWO引脚ITM机制同时在另一个串口终端里看业务数据这样两个数据通道互不干扰。但SWO方式只支持有SWO引脚的目标芯片而且占用调试口不是所有板子都方便。所以更多时候我仍然选择J-Link虚拟串口做业务日志简单直接。6. 翻车现场汇总这些问题我都替你踩过了6.1 枚举不到“J-Link CDC UART Port”怎么办这是最常遇到的问题表现是J-Link调试功能正常但设备管理器里没有COM口。可能原因和排查顺序先确认固件是不是完整版用J-Link Commander输入vcom enable试试如果命令不存在就基本锁定是固件问题然后检查驱动可以在设备管理器“J-Link”设备上右键属性查看固件版本和驱动版本最后检查USB线和USB口换线换口再试。如果固件确实不支持或者固件版本太老就要回到第2.2节说的刷614e.hex或对应完整固件。刷完后如果仍然没有COM口再看硬件上是不是根本没引TXD/RXD这时就只能检查PCB丝印或原理图了。6.2 SWD/JTAG Communication Failure“SWD/JTAG Communication Failure”这个报错几乎每个用过J-Link的人都遇到过。我总结最常见的原因是目标板供电不足或复位引脚被拉低。V9通过VTref检测目标板电压如果VTref没接J-Link会认为目标板不存在直接报通信失败。所以接好VTref是第一步。第二个常见原因是SWDIO和SWCLK接反或接触不良尤其是杜邦线插在排母上松脱。第三个原因是目标板进入了低功耗模式或调试接口被禁用比如STM32代码里把SWD引脚复用成普通GPIO了这种只能通过复位时序来抢时间下载或者用串口先擦除芯片。还有一种V9本身驱动能力弱SWD线太长或线材质量差也会导致通信失败缩短线材或换屏蔽线基本能解决。6.3 串口乱码或首字符丢失虚拟串口出现乱码第一排查波特率第二排查共地第三排查电平匹配。7816、115200这种整数波特率一般没问题但如果你用了非标准波特率比如9600之外的7200J-Link虚拟串口的时钟分频可能不准容易乱码。电平不匹配时乱码也很明显如果目标板是5V而V9的RXD只容忍3.3V长时间使用还可能损伤引脚。“首字符丢失”或者“每次复位后第一个字节是0x00或0xFF”也是老问题。这个现象和J-Link虚拟串口枚举时机有关目标板复位时MCU的串口TX引脚可能处于高阻或未初始化状态J-Link虚拟串口在这个瞬间会采样到无效电平并输出一个伪字节。解决方法是初始化串口后延时几毫秒再printf或者在协议里加帧头判断从业务层忽略无效字节。6.4 V9变砖后的自救刷固件刷到一半断电、驱动卸载时误删了系统文件、或者乱刷了不匹配的固件V9可能会“变砖”表现为插上后电脑完全没反应设备管理器里出现未知设备或者完全不识别。别慌V9的硬件没坏大多数情况是固件写坏了bootloader还在。找回的方法是按住板上的BOOT键再插入USB让STM32进入系统bootloaderDFU模式这时候电脑上会多出一个“STM32 Bootloader”设备。然后打开STM32CubeProgrammer选择USB DFU方式连接擦除Flash再烧入正确的614e.hex。如果BOOT引脚没有引出就得焊线短接到对应引脚麻烦一点但能救活。救活之后重新安装SEGGER驱动V9就满血复活了。7. 我的真实体会虚拟串口是好但别指望它包打天下用J-Link V9虚拟串口两年多回头看它最大的价值不是“技术上的提升”而是“流程上的简化”。出差调试不用带两条USB线和两个工具桌面上清爽了项目交接时也不用告诉对方“你还要配一个USB转TTL”只要一个J-Link V9就能帮他搞定下载、调试和日志这个体验差异对新手特别友好。但也有两个我一直不太满意的点。第一是最高波特率不稳到了460800以上虚拟串口的数据延迟和丢包就开始显现这类场景我直接上USB转TTL模块不只是因为性能还因为原生串口芯片的数据通路更简单少一层中转就少一个变量。第二是隔离问题凡是涉及高压、电机驱动、强干扰的调试现场我依然会使用隔离型USB转串口或隔离型调试器J-Link虚拟串口不适合在这种场合用这不是它不行而是隔离在该场景是硬需求。如果你也想省一根线我建议按这个顺序来先确认V9固件支持VCOM再刷好驱动然后用万用表或逻辑分析仪找到你手中这块板子的TXD/RXD引脚最后按交叉接法连好、共地开一个115200的串口助手试试。整个过程半小时内就能跑通跑通之后你会发现一根线搞定SWD调试和串口通信还真不是标题党。