ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

J-Link隐藏技能:用VCOM虚拟串口一根线搞定调试与日志

2026/9/25 4:23:57 拓冰建站 浏览量
J-Link隐藏技能:用VCOM虚拟串口一根线搞定调试与日志 做嵌入式调试这几年我最大的感受是桌面上永远缺一根线。USB转TTL模块接日志串口ST-Link接烧录再来一条杜邦线连地线桌面基本就乱了。后来我仔细把玩手头那块J-Link才发现它其实自带了一个虚拟串口VCOM功能开启之后一根USB线就能同时搞定烧录、调试和串口日志外接USB转TTL模块的钱和桌面空间都能省下来。这篇文章就把用JLink Commander开启VCOM的完整流程、底层逻辑和踩过的坑都写清楚适合单片机开发者、嵌入式刚入门的朋友以及手里躺着J-Link却一直没用过这个隐藏功能的人。1. 什么是VCOM为什么J-Link能“兼职”串口1.1 从一次找USB转TTL模块说起有次我在一块STM32F103的板子上调一个小项目需要同时看串口日志和在线仿真。手头常用的CH340模块正好插在另一台电脑上翻遍抽屉也没找到第二根USB转TTL线。那时候我才开始认真研究J-Link上那个一直没被我正眼瞧过的VCOM功能。J-Link的VCOM全称Virtual COM Port意思是J-Link通过USB向电脑枚举出一个额外的虚拟串口。电脑端看到的效果就是设备管理器里多了一个COM口但是数据并不是从什么独立物理串口芯片进出的而是走J-Link和目标板之间那根20针排线上的串口信号。换句话说我只要把目标板的UART引脚接到J-Link连接器对应的引脚上就等于免费拿到了一个带缓冲、带官方驱动的“USB转串口”而且这个转串口和J-Link的调试烧录功能共用同一条USB线。1.2 VCOM的工作原理与典型场景虚拟串口在底层是一个标准的USB CDC设备。J-Link主控内部除了SWD/JTAG调试通道还内置了串口桥接逻辑USB枚举时会把两个功能一起暴露给电脑一个调试接口F5驱动下通常显示为“J-Link”一个串口接口显示为“J-Link Virtual COM Port”。目标板那边串口数据从J-Link连接器上的指定引脚进入主控再由USB传到电脑上的串口调试助手。整个过程对用户来说就是一个普通COM口完全透明。用它最典型的场景有三类调试日志输出。目标板MCU的printf通过UART重定向到VCOM打断点看变量的同时还能实时看日志。上位机联调。开发阶段用电脑上的Python、串口助手直接和目标板通信不需要单独准备USB转TTL。替代板载USB转串口芯片。很多自己画的板子为了省成本不焊CH340VCOM正好补上这个缺口。下面这张表可以直观对比一下VCOM和传统USB转TTL模块的区别对比项外接USB转TTL模块J-Link VCOM需要的线缆USB线杜邦线有时还要额外供电一条USB线串口信号走调试排线驱动依赖CH340/CP2102/FTDI等单独驱动只需要SEGGER J-Link官方驱动占用资源单独一个USB口和调试共用一个USB口附加价值只有串口功能串口调试烧录三合一采购成本便宜但要多买一个模块J-Link自带不需要额外花钱当然VCOM不是没有代价。它复用了调试接口上的一部分引脚在极端情况下可能和SWO、JTAG等功能打架这部分放到后面“常见问题”里细说。2. 开启VCOM前的准备工作2.1 先确认你的J-Link到底支不支持不是所有叫“J-Link”的东西都能开VCOM。SEGGER官方的J-Link BASE、PLUS、ULTRA、PRO以及各类J-Link OB基本都支持虚拟串口但市面上一大堆“兼容版”或老版本克隆设备就不好说了。很多克隆版虽然能烧录、能调试但固件里根本没有VCOM这部分代码敲命令只会得到一个“Unknown command”之类的提示。判断方法很简单。第一步把J-Link插到电脑上打开设备管理器看USB设备里有没有“J-Link”标准设备。第二步在SEGGER安装目录下打开JLink.exe也就是JLink Commander启动过程中会打印设备型号、序列号、固件版本和支持的功能列表如果里面有“Virtual COM Port”相关字样说明硬件支持。第三步也是最容易被忽略的检查固件版本。太老的固件对VCOM支持不完善建议去SEGGER官网下载最新的J-Link软件包插上设备后一般会提示升级固件升级后再试。注意我见过有些开发板自带的“J-Link OB”在设备管理器里会显示两个设备一个调试口一个“JLink CDC UART Port”。这种通常就是板厂在设计时已经把VCOM引到了MCU串口上属于现成的VCOM不用额外接线直接就能用。2.2 安装驱动并熟悉JLink Commander开启VCOM之前先确保本机安装了SEGGER J-Link软件包。Windows下安装完成后JLink Commander通常位于C:\Program Files\SEGGER\JLink\JLink.exe开始菜单里也能找到一个叫“JLink Commander”的快捷方式。Linux和macOS下则是在终端里执行JLinkExe命令。这里要插一句驱动相关的经验不少人为了让克隆版J-Link能正常工作特意装旧版本驱动结果VCOM功能跟着被旧驱动限制住了。我的建议是如果手头是官方或兼容性较好的J-Link尽量用新版本驱动如果是明显阉割过的克隆版VCOM很可能永远用不了别在这上面浪费时间干脆用外置USB转TTL。启动JLink Commander后界面是一个交互式命令行。先不用急着连接目标板直接在提示符后面输入help看看当前固件支持哪些命令。如果支持VCOM命令列表里一般会有vcom相关条目。这一步能避免后续“打开方式不对”的尴尬。3. 用JLink Commander开启VCOM的完整实操3.1 进入命令行模式以Windows为例打开命令行工具进入SEGGER安装目录cd C:\Program Files\SEGGER\JLink JLink.exe如果J-Link已经插在电脑上程序启动后会自动识别设备并显示类似下面的信息SEGGER J-Link Commander V7.94 DLL version V7.94, compiled ... Firmware: J-Link V11 compiled ... Hardware version: V11.00 S/N: 123456789 Features: RDI, FlashBP, FlashDL, JFlash, RDDI, VCOM注意看“Features”一行如果包含VCOM说明固件支持虚拟串口。如果没有后面的命令大概率白搭。3.2 输入开启命令并验证结果在JLink Commander命令行提示符下输入vcom enable不同版本的写法略有差异有的会提示Virtual COM Port enabled有的会直接返回OK。如果固件不支持会提示VCOM is not supported或Unknown command。我实测下来较新的V10、V11固件用vcom enable这个语法基本都能通过。输入成功后退出命令行exit然后拔插一次J-Link或者等待几秒让系统重新枚举USB设备。打开设备管理器在“端口(COM和LPT)”下面应该能看到一个类似“J-Link Virtual COM Port (COM8)”的新条目。到这一步VCOM就开启成功了。假如你用的版本对vcom enable不认有两个变通办法在JLink Commander里输入help从输出里找与“vcom”或“virtual”相关的命令。打开图形工具“J-Link Configurator”在设备列表里选中J-Link看看右侧有没有Virtual COM Port的勾选项勾上后点击Apply。整件事的逻辑其实很简单VCOM功能默认不占用USB端点只有通过命令或工具显式开启后固件才会在USB枚举时多暴露一个CDC接口。所以有些用户插上J-Link后一直没看到COM口不是设备坏了而是压根没开。3.3 关闭VCOM与恢复默认状态哪天不想用VCOM了同样的命令反着来就行vcom disable退出后重新枚举设备管理器里的COM口就会消失。我个人的习惯是平时保持VCOM开启因为它不影响SWD调试只有在遇到调试下载异常、需要排除USB枚举干扰时才关闭VCOM等定位完问题再重新开启。J-Link的配置是有非易失存储的开启一次后断电重插也会保持不用每次敲命令。4. VCOM的实际应用场景与串口调试心得4.1 边看日志边打断点的“一根线”玩法VCOM真正爽的地方是调试时终于不用来回切USB转TTL了。以常见的STM32开发板为例连接方式是这样的目标板MCU的UART_TX → J-Link连接器的VCOM_RX引脚目标板MCU的UART_RX → J-Link连接器的VCOM_TX引脚GND → GND共地是必须的不过这里有个让我第一版翻车的细节不同型号J-Link的VCOM信号在20针连接器上的引脚定义不完全一样有些型号复用SWO和TDI有些则挂在SWDIO上。最稳妥的办法是查你手上具体型号的用户手册或者看开发板原理图里J-Link连接器旁边有没有VCOM标注。我用过的几块主流开发板多数是把VCOM_RX接到SWO脚、VCOM_TX接到TDI脚这样在SWD调试模式下不会和SWDIO/SWCLK引脚冲突调试和串口可以同时用。接线完成后在代码里把printf重定向到该UART然后用XCOM、SSCOM或者串口调试助手打开VCOM对应的COM口就能实现一边单步调试一边看日志的效果。我用这个方式调试过一个PID温控程序调参数的时候温度曲线能实时打印同时还能停死在某个断点看内部变量效率比原来“烧一版、拔线、看串口、再插线”的老流程高太多了。4.2 虚拟串口波特率背后的真相很多人在虚拟串口上调了半天发现波特率怎么改数据都正常然后又有一天怎么改都不对于是开始怀疑人生。这里得讲清楚一个底层事实VCOM本质是USB CDC设备波特率只是USB CDC描述符里的一个参数实际并不参与USB总线的数据传输时序。电脑端打开串口时填的波特率对数据流向几乎不产生任何影响。真正决定每一帧数据节奏的是目标板MCU内部UART外设的实际波特率。换句话说目标板跑115200PC端串口助手填9600很多时候照样能收到完整数据这不是玄学是虚拟串口“无视波特率”的特性。但这不代表波特率可以乱填。出现乱码时第一优先级永远是检查目标板UART分频是否正确、代码初始化是否成功而不是怀疑PC端填错了。部分串口调试工具在特定波特率下会接管DTR/RTS引脚可能触发目标板复位所以要留意这类“设备自己复位”的现象通常和VCOM无关而是上位机控制信号的问题。我实测下来用VCOM做115200、256000这些常用波特率都没问题。如果日志量特别大想要更高的实时吞吐率可以考虑关闭SWO调试把USB带宽尽量让给VCOM。4.3 与串口调试助手、Python等工具配合开启VCOM后它在操作系统里就是一个标准COM口所有能操作串口的软件都能直接使用图形工具XCOM、SSCOM、串口调试助手等用来收发字符串、看16进制数据。Python的pyserial适合自动化测试和脚本化日志采集import serial ser serial.Serial(COM8, 115200, timeout1) ser.write(bAT\r\n) line ser.readline() print(line) ser.close()Linux下可以用minicom、picocom或者直接读写设备节点sudo screen /dev/ttyACM0 115200想抓底层USB数据可以用Wireshark配合usbpcap确认数据有没有到驱动层。这套组合对产品调试特别有用。以前我要把一台设备的数据转成Excel表得手动从串口助手复制粘贴现在直接用Python脚本把VCOM数据攒起来处理完直接生成图表连上位机都不用额外开发。5. 常见问题与排查技巧实录5.1 设备管理器里根本没有COM口这个问题排在所有VCOM报错里的第一位。按这个顺序排查确认执行过vcom enable且JLink Commander启动时Features列表里有VCOM。拔掉J-Link重新插或者换一个USB口再试排除USB枚举异常。设备管理器里看有没有“未知设备”或“J-Link (with CDC)”带黄色感叹号有的话右键更新驱动让它重新匹配SEGGER的驱动。检查J-Link固件是不是太老去官网下新版软件包升级。如果用的是克隆、精简版J-Link很可能硬件上就没焊虚拟串口相关的电路直接停止折腾。另外提醒一下部分开发板上的J-Link OB在硬件连接上就没有引出VCOM信号到MCU这时候设备管理器可能会有COM口但数据收发永远没反应需要看板子原理图确认VCOM信号有没有接到目标芯片的UART引脚。5.2 有COM口但打开就报错或秒退COM口存在说明枚举成功了这时候打不开多半是被别的程序占用了。Windows下很多软件会默认轮询所有串口比如一些键鼠灯光控制工具、GPS定位软件、甚至老的蓝牙驱动都可能把COM口先占了。排查方法先关掉所有和串口有关的软件再用串口调试助手打开。如果是Linux环境可以查一下端口被谁占用fuser /dev/ttyACM0还有一种情况是COM口号冲突。之前装过CH340、CP2102等设备的驱动系统给它们分配过COM号现在VCOM又被分到同一个编号结果老设备的残留信息把端口占住了。解决方法是到设备管理器里右键VCOM对应的端口进入“端口设置-高级”手动改一个没用过的COM号。很多“串口烧写失败”的报错根源就是COM口号冲突烧录软件根本打不开对应端口。5.3 数据乱码、丢包与引脚冲突乱码和丢包的原因通常集中在四块目标板UART波特率与代码实际不一致。比如HAL库初始化时时钟分频算错板上跑出来的实际波特率已经偏移了。接线太长或接触不良尤其杜邦线飞线时GND没共地会导致信号电平漂移。供电不足。目标板电压不稳时串口电平会跟着抖动低波特率还好高波特率下容易出现随机坏字节。调试带宽抢占。一边用SWD频繁打断点、一边大量收发串口数据VCOM的数据可能被缓冲延迟看起来像掉包。最后这点我踩过很深的坑。当时跑一个每秒打印200行日志的传感器程序同时又在Keil里开了实时变量监控结果串口日志隔几秒就卡顿一次。后来把日志频率降到50Hz再把SWD的实时刷新关掉问题立刻缓解。VCOM和调试共用USB带宽别把它当工业级高速串口用。5.4 SWO同步追踪和VCOM同时用会打架如果你用SWO做ITM调试输出比如Keil的Trace窗口同时又开着VCOM两者可能在硬件引脚的复用上发生冲突。原因前面说过VCOM的接收信号在不少J-Link型号上正好复用了SWO引脚。SWO用来做单片机异步输出VCOM又要在同一根线上接收数据两个功能抢一个引脚结果往往是两端都不稳定。解决思路有两个方向。硬件上确认设计时VCOM和SWO是否各自独立或者使用不使用该引脚的J-Link型号。软件上临时关闭ITM的SWO跟踪或者关闭VCOM优先保证当前最需要的那一项。如果你确实需要同时做SWO指令跟踪和串口日志建议另外用一个USB转TTL模块承担串口把VCOM关掉给调试让路。5.5 烧录失败但串口功能正常的奇怪现象有一种情况很多人可能遇到过VCOM正常工作串口收发都没问题但一烧录或者一进入调试就报错出现“Cannot connect to target”或“RDDI protocol error”。这时候别急着怀疑VCOM先检查是不是目标板供电不足再检查SWDIO和SWCLK是否被其他外设占用。如果目标板代码里把SWD引脚复用成了GPIO也会导致烧录失败。某些情况下VCOM的开启会改变J-Link的USB答案包结构配合不良USB转接器可能造成枚举不稳。表现是设备管理器里COM口一闪一闪同时烧录软件认不到J-Link。这种问题可以先关闭VCOM重新枚举看是否恢复以此确认是不是USB稳定性问题。经常出差用笔记本调试的朋友建议优先使用高质量USB数据线少用延长线和HUBVCOM这个功能本身不挑线但USB传输一旦丢包就全堵在一起表现成各种奇怪的超时。写在最后的个人建议VCOM用了一年多我的经验是它不适合做高实时、大数据量的串口替代方案但在日志调试、协议验证、临时通信这些常规场景里它给我的便利是实打实的。把USB转TTL模块省掉以后桌面上少了一堆线不说出差时只需要带一个J-Link就能同时满足烧录、调试、串口日志三个需求相当省心。建议新手朋友拿到J-Link后先打开JLink Commander敲一下vcom enable给系统提个RDDI驱动升级到最新确认设备管理器里出现COM口然后找一个最简单例程跑一遍串口收发。整个过程二十分钟都不用。真等你在调试现场被一堆线搞得头大的时候就会庆幸自己提前把VCOM这个隐藏功能摸清了。