尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

JLink的隐藏技能:开启VCOM虚拟串口,一根USB线搞定调试和日志

JLink的隐藏技能:开启VCOM虚拟串口,一根USB线搞定调试和日志 1. 为什么你手里的JLink一直缺一个串口很多玩嵌入式的朋友手头都有一根JLink少则几十块钱的V8兼容版多则原厂正版JLink EDU或者J-Link PLUS。大家用它下载程序、在线调试、查看寄存器用得挺顺手但很少有人注意到一个问题这根调试器明明插着USB线连到电脑数据线、地线、电源线都齐了它却始终没有在系统里变出一个COM口来。我做嵌入式开发这几年遇到过太多次这种场景板子上跑着RTOS需要打印日志定位问题但板载串口芯片坏了或者手头的USB转TTL模块刚好被同事借走临时要用串口却抓瞎再或者调试两块板子之间的串口通信电脑只有一个USB口能用插了调试器就插不了串口模块。这时候我总会想要是JLink能直接当串口用该多好。答案其实是能的而且原厂早就把这个功能做进去了只是藏得比较深。这个功能叫VCOM也就是Virtual COM Port虚拟串口。它并不需要你额外刷固件、改硬件也不需要拆开外壳飞线只要用官方提供的JLink Commander这个命令行工具敲几行命令就能把JLink的虚拟串口功能打开。打开之后你的电脑里就会多出一个标准的COM口可以像用普通串口一样去收发数据而这一切走的都是JLink那根USB线。这个技巧对那些常年在实验室里串口不够用、USB口也不够用的人来说属于那种知道以后就回不去的隐藏技能。这篇文章我就把整个操作过程、原理、踩坑点都拆开讲清楚尤其是那些网上教程没写明白、容易让人卡壳的细节。2. 先把基础概念理清VCOM和UART COM到底什么关系2.1 VCOM不是模拟出来的而是芯片内部真实存在的功能先说一个容易误导人的点。很多人一听虚拟串口第一反应是软件模拟以为它是像Virtual Serial Port Driver那样在系统里凭空造一对串口把数据从一个口转发到另一个口。实际上JLink的VCOM完全不是这个逻辑。JLink调试器内部主控芯片一般是Atmel或者NXP的ARM芯片自带USB Device控制器这个控制器在USB协议层面支持一种叫做通信设备类CDC的接口。CDC是USB规范里专门用来承载串口、网卡、传真等通信功能的类。当JLink固件在USB枚举阶段向电脑声明我有一个CDC接口时Windows、Linux、macOS就会自动为这个接口分配一个COM口。所以VCOM是硬件级的功能走的是JLink主控芯片里真实的UART外设引脚就是JLink连接器上那几根固定的TXD、RXD。它跟你在STM32板子上外接CH340、FT232做出来的USB转TTL串口在工作原理上没有本质区别区别只在于CH340是单独一颗芯片专门干这个事而JLink是顺手把主控芯片里空闲的UART资源给你用。2.2 JLink连接器上的UART引脚是哪几根这里必须明确一个关键信息VCOM使用的TXD、RXD就是JLink标准20针接口里的第4脚和第5脚也有叫法是TMS、TCK旁边的那组。具体定义如下引脚名称方向作用1VTref输入目标板参考电压检测2TVCC输出供电部分版本可输出3.3V4TMS双向SWD数据线5TCK输出SWD时钟线6TDO/SWO输出调试数据输出7TXD输出虚拟串口发送JLink发目标板收8RXD输入虚拟串口接收目标板发JLink收9GND-地线可以看到TXD和RXD是专门独立的引脚跟SWD调试用的四根线完全分离。这意味着你可以一边用JLink的SWD接口给STM32下载程序一边用同一根20针排线里的TXD/RXD接目标板的串口引脚实现下载调试串口日志同时工作一根线全搞定。2.3 为什么默认情况下VCOM是关着的既然硬件支持为什么大家插上JLink后看不到COM口因为JLink Commander里的USB枚举配置默认只启用了调试器和虚拟存储这两个功能VCOM需要在固件层面主动使能。官方这样设计一方面是考虑到不是所有用户都需要虚拟串口开启后会多占一个USB端点资源另一方面也是因为VCOM在部分老版本固件中属于需要额外开启的增强特性保持默认关闭能兼容更多老式调试软件。搞清楚这一点接下来的操作思路就非常清晰了用JLink Commander连接调试器通过命令行修改其USB功能配置把VCOM选项打开然后重新枚举USB设备让电脑重新识别出新出现的COM口。3. JLink Commander打开VCOM功能的完整实操3.1 前置准备驱动和软件版本在动手之前先把环境准备好。你需要装好SEGGER官方的J-Link Software Pack一般叫J-Link Software and Documentation Pack可以从SEGGER官网下载。安装包里自带JLink.exe也就是JLink Commander还有JLinkConfig.exe等其他工具。这里有一个非常重要的版本提醒想用VCOM功能JLink的驱动版本不能太老。我最早用4.90版本的时候VCOM功能只在部分JLink型号上有效而且命令格式跟现在不完全一样。建议直接下载当前官网最新的稳定版比如V7.x以上的版本命令兼容性和功能完整性都有保障。另外一个容易被忽略的点Windows系统下如果之前装过其他版本的SEGGER驱动建议先卸载干净再装新版否则可能出现JLink Commander里识别到调试器但打开VCOM后系统不弹新COM口的情况。这通常就是新旧驱动残留导致USB设备描述符解析异常。3.2 打开JLink Commander并确认连接打开命令行进入JLink的安装目录一般是C:\Program Files\SEGGER\JLink运行JLink.exe程序启动后会提示你输入要连接的目标设备型号。这里不用真的连单片机直接输入一个不存在的型号名或者直接敲回车跳过即可。之所以这样是因为我们要做的操作是针对JLink调试器本身的USB配置不依赖任何目标芯片。如果JLink固件版本比较老启动时可能会提示Do you want to update the firmware?这时候建议选择y升级到最新固件。老固件在VCOM功能上经常有或多或少的Bug升级固件虽然偶尔会遇到兼容性问题但总体来说是利大于弊的。启动成功后会看到类似这样的提示SEGGER J-Link Commander V7.86 J-Link在J-Link提示符下输入usb命令会看到当前JLink的支持功能列表。重点关注其中有没有VCOM字样。如果列表里显示VCOM Disabled说明你的JLink型号支持这个功能接下来一步就是打开它。3.3 最关键的一步启用VCOM在JLink Commander命令行里输入vcom enable注意这条命令是vcom、空格、enable中间不能有拼写错误。执行后程序会返回类似下面的信息V-COM is enabled. Please reconnect the probe to let the change take effect.意思很明确VCOM功能已经打开了但要让改动生效需要把JLink从电脑上拔掉重新插一下或者重启JLink Commander。这是因为USB设备描述符在枚举阶段就应该确定好运行中修改无法立即生效必须重新枚举。此时不要直接关掉命令行就完事正确操作是在JLink命令行输入exit退出。拔掉JLink的USB线。等两三秒重新插回电脑。打开设备管理器展开端口COM和LPT就能看到一个类似J-Link CDC UART Port (COM3)的新设备。如果没看到右键刷新设备管理器或者重新插拔一次。极少数情况下Windows会要求安装CDC驱动直接在设备管理器里选择自动搜索驱动程序即可Windows Update会自动匹配SEGGER提供的驱动。3.4 关闭VCOM的方法想关掉也很简单同样的操作流程只是把命令换成vcom disable关掉之后重新插拔JLink虚拟串口就会消失。这个开关是持久化存储到JLink内部Flash的断电、重装驱动都不会改变所以设置一次就不用管了。这里我想多说一句很多教程只讲了enable没说disable导致有些人打开后嫌占COM口又不知道怎么办只能重刷固件。实际上SEGGER早就考虑到了命令就是对偶的enable和disable都支持。4. VCOM真正能干什么实测三个典型场景4.1 场景一给STM32打印日志省掉USB转TTL模块这是我用VCOM最频繁的场景。手头有一块STM32F407的开发板板载CH340串口芯片但有一次CH340驱动跟系统冲突插上后设备管理器直接不识别。恰好JLink还插在SWD接口上于是我把JLink的RXD引脚飞线接到STM32的PA9USART1_TX把JLink的TXD接到PA10USART1_RX共地然后在代码里用USART1以115200波特率打印日志。打开设备管理器看到VCOM映射到了COM4。用串口调试助手打开COM4波特率设为115200数据位8、停止位1、无校验打开串口后按一下开发板复位键日志哗哗地就出来了。整个过程中JLink同时还承担着SWD调试任务下载程序、打断点、观察变量都是正常的完全不受VCOM影响。这相当于一根USB线干了两件事——调试器和串口省下的那个USB口可以插逻辑分析仪或者另一个调试器。4.2 场景二双机通信调试用两个JLink互相连接有一次我要测试两块STM32之间通过UART通信的协议正确性需要一块板子发数据、另一块接收同时把两边的收发内容都显示在电脑上。常规做法是两块板子各接一个USB转TTL模块到电脑再加一个串口助手开两个窗口分别看。那天我手头只有一个USB转TTL模块却有两根JLink。于是我把JLink A的VCOM当板子1的串口把JLink B的VCOM当板子2的串口在设备管理器里分别看到COM5和COM6。两个串口助手分别打开COM5和COM6独立收发互不干扰。调试过程中还可以用JLink的SWD功能给板子下程序整个桌面干净利落全是JLink的排线在飞。这个场景充分地说明了一个道理VCOM不是只能当备用串口用在多路串口同时调试时它其实就是一组高质量的USB转UART只不过刚好长在调试器上。4.3 场景三目标板没有板载串口芯片时应急现在很多自定义板卡为了省成本、省面积并不焊接CH340、FT232之类的USB转串口芯片而是留一组UART排针让你自己外接模块。但如果你连模块都没有而恰好有一根JLink那VCOM就是最好的应急方案。我同事就遇到过他做了一块基于GD32的小板子只预留了SWD接口和UART排针没有板载转串口。第一次上电跑程序需要看启动日志确认系统有没有跑起来但实验室里所有USB转TTL模块都被借光了。我告诉他用VCOM把JLink的TXD/RXD飞线接到板子的UART两分钟就看到了日志省去了等模块的时间。实际上在量产调试、产测工装、长期运行日志记录这些场景中VCOM的价值比很多人想象得高。它稳定、隔离性好、不受目标板供电波动影响而且JLink本身有电压检测能通过VTref引脚判断目标板是否上电这比普通USB转TTL模块盲接更有保障。5. 接线方法和电平匹配的避坑指南5.1 接线图与引脚对应细节接线其实不复杂但有一个很多人犯的错把TXD和RXD接反了。TXD是发送端RXD是接收端交叉连接才正确。比如你要连接STM32的USART1JLink引脚连接目标说明JLink TXDSTM32 PA10 (USART1_RX)JLink发送STM32接收JLink RXDSTM32 PA9 (USART1_TX)STM32发送JLink接收JLink GNDSTM32 GND共地必须接接线的时候用杜邦线直接插在JLink 20针转接板或者杜邦母头上都行。如果你用的是一根裸排线JLink 20针定义里TXD是在第7脚RXD是在第8脚。不同版本JLink的引脚定义可能有细微差别建议打开JLink安装目录下的J-Link User Guide文档查阅对应型号的引脚图这是最稳妥的。5.2 电平匹配3.3V和5V目标板怎么接JLink的UART电平是3.3V TTL电平也就是高电平约3.3V。如果你连的目标板是3.3V系统比如STM32、GD32、nRF52系列直接对接完全没问题。如果目标板是5V系统比如老式的51单片机或者Arduino UNO理论上3.3V的UART也可以工作因为很多5V芯片的逻辑高电平阈值只要大于2.0V左右就能识别为高电平。反向传输时JLink的RXD引脚通常是容忍5V输入的这点在官方文档里有说明。不过为了长期可靠性还是建议在RX线路上串联一个1k电阻做限流或者用电平转换模块。这个问题上我踩过坑有一次直接拿JLink的VCOM去连一块5V的LPC1768板子刚开始通信正常后面地把USB口的一个引脚搞坏了JLink直接变成未知设备。后来检查发现是目标板电源没有完全关断5V通过UART引脚反灌到了JLink内部。所以强烈建议接线前确认两边电源都断开接好线后再上电。5.3 波特率设置VCOM支持的范围VCOM使用的是JLink主控芯片内部UART外设不是软件模拟出来的所以波特率的支持范围非常宽。常见使用的9600、19200、38400、57600、115200、230400、460800、921600都是可以正常工作的。Windows下串口助手设置波特率时直接选就行。有一点要注意修改波特率之后要确认目标板串口和JLink VCOM两边设置一致。如果出现乱码十有八九是波特率不匹配或者接线错误导致信号质量差尤其在使用杜邦线长距离飞线的时候建议把波特率降到38400以下可以减少误码。JLink的VCOM不提供流控引脚没有CTS/RTS所以不支持硬件流控。如果你要通信的目标设备开启了硬件流控需要改成无流控模式或者用软件流控XON/XOFF。实际上嵌入式串口通信一般都不开流控影响不大。6. 踩坑实录打开VCOM后不出现COM口的排查链路6.1 现象描述用vcom enable命令成功返回V-COM is enabled之后按照提示重新插拔了JLink设备管理器里却没有出现任何新COM口。这是我在论坛上见过最多的问题自己也踩过一次。6.2 第一步确认JLink是否被系统识别打开设备管理器展开通用串行总线控制器或者J-Link分类看JLink本体是否正常识别。在旧版本SEGGER驱动下JLink会显示为J-Link设备在较新版本下会显示为J-Link (CDC)或者J-Link OB。如果JLink这个设备本身都变成了黄色感叹号说明USB驱动出了问题。优先重装SEGGER软件包然后拔插USB。6.3 第二步检查是否被系统隐藏了端口Windows设备管理器有一个坑端口COM和LPT分类下如果串口设备曾经出现过后来被拔出系统可能会在查看—显示隐藏的设备时才显示。别急先点击设备管理器菜单栏的查看勾选显示隐藏的设备看看灰色半透明的COM口是否存在。如果存在右键选择启用设备即可。6.4 第三步确认硬件版本和固件是否支持部分老款JLink V8、V9兼容版虽然硬件看起来能用但主控芯片的固件并不是SEGGER官方最新的VCOM功能可能根本没有被编译进去。这时候vcom enable即使返回成功实际也不会出现COM口因为USB描述符里压根没有CDC接口。判断方法很简单在JLink Commander里输入usb如果功能列表里连VCOM Disabled都不显示直接就看不到VCOM这个条目那么基本可以断定固件不支持。这种情况的解决办法只有两个一是升级到官方固件二是换一根支持VCOM的JLink。对于市面上那些用V9盗版芯片改的兼容JLink固件升级有风险容易变砖建议谨慎操作。6.5 第四步检查USB枚举是否被占用有一种情况比较隐蔽当你打开JLink Commander的同时另外一个软件比如IAR、Keil、J-Flash也在占用JLink这时候VCOM的使能操作可能处于一个半挂起状态。我遇到过一次IAR正在调试我同时打开JLink Commander执行vcom enable返回成功但重新插拔后还是没有COM口。后来把IAR的调试会话完全关闭再执行一次vcom enable重启JLink Commander问题就解决了。SEGGER的JLink支持多进程同时访问但VCOM的配置属于底层USB配置必须在没有其他软件占用USB接口通道的情况下操作才稳定。6.6 排查总结一个通用的检查顺序顺序检查项操作1JLink本体是否正常识别设备管理器查看是否有黄色感叹号2端口分类下是否有隐藏设备勾选显示隐藏的设备3固件是否支持VCOMusb命令查看功能列表是否有VCOM4是否有软件正在占用JLink关闭Keil、IAR、J-Flash等调试工具5驱动版本是否过旧升级到最新J-Link Software Pack6重新插拔USB让USB枚举重新执行按照这个顺序排查绝大多数打开VCOM不出现COM口的问题都能解决。7. VCOM与普通USB转TTL串口的对比选择7.1 应用场景对照表很多朋友会问既然我已经有CH340或者FT232了VCOM还有必要开吗这要看场景。我列一个表对比对比维度JLink VCOM独立USB转TTL模块占用USB口数量复用JLink的USB不额外占口每个模块占一个口串口路数默认1路一个模块1路可堆叠电平类型3.3V TTL取决于模块常见3.3V/5V可选带电隔离跟随JLink的USB隔离设计大多数模块没有隔离波特率范围最高可达921600CH340一般最高2Mbps目标板电压检测支持通过VTref引脚不支持成本和占用空间复用现有调试器零额外成本额外购买设备驱动依赖依赖SEGGER驱动CH340/FT232驱动7.2 什么场景下依然推荐用独立USB转TTL模块VCOM虽好但并非万能。如果你的项目需要同时调试多路串口比如一个设备有3个UART都要看日志而你又只有一根JLink那还是得配合USB Hub加多路USB转TTL模块因为JLink VCOM只有一路。此外如果你做的板子电压域是1.8VJLink的3.3V TTL电平就不合适了这时候用支持1.8V电平的USB转TTL专用芯片更安全。在Windows下VCOM的驱动模型走的是SEGGER的CDC驱动跟CH340这类独立串口芯片相比在部分国产串口调试工具比如某些山寨串口助手中可能存在兼容性差异。我用的时候发现SSCOM、XCOM这些主流助手都能正常识别JLink的VCOM但个别老掉牙的串口工具只认标准COM口设备理论上CDC也算标准COM口实际测试下来基本都能用。7.3 我的个人建议我的使用习惯是只要在调试中需要同时下载程序看串口日志优先用VCOM。但如果只是单纯给一个模块发AT指令或者算一个传感器数据那手边有什么就用什么。说到底VCOM的意义在于化零为整让一个原本只能干一件事的设备同时干两件事这对工位USB口紧张、或者经常在外面跑现场调试的人来说价值是实打实的。8. 进阶玩法与扩展思路8.1 JLink RTT和VCOM的配合使用JLink还有一个很强大的功能叫RTTReal-Time Transfer它通过SWD接口实现高速日志输出不需要占用UART引脚。RTT的速度可以跑到几MB/s远高于UART。那VCOM还有存在的必要吗有。RTT需要在目标板代码里移植SEGGER_RTT库并且调试会话必须一直占用JLink。如果你只是想把一段串口数据原样转给另一个设备看或者目标芯片的SWD接口被禁用比如某些低功耗模式下SWD引脚被复用为GPIORTT就用不了了。VCOM作为一个物理UART通道跟RTT正好互补。一个实用的小技巧同时开启RTT和VCOM用RTT输出高频调试数据用VCOM输出低频状态信息比如GPS NMEA语句、传感器原始数据。这样两个通道各司其职调试效率极高。8.2 在Linux下使用JLink VCOMLinux下JLink VCOM同样适用。SEGGER的Linux版驱动安装包里带有udev规则插上JLink并开启VCOM后系统会创建一个/dev/ttyACM0之类的设备节点。用minicom或者screen打开screen /dev/ttyACM0 115200需要注意Linux下如果同时插入多个JLink设备节点可能会变化建议用ls /dev/ttyACM*确认一下。另外Linux下JLink VCOM的权限控制可能有问题如果无法打开设备检查是否在dialout组里或者用sudo usermod -a -G dialout $USER添加权限后重新登录。8.3 自制一根JLink串口二合一排线基于VCOM功能我给自己做了一根2.54mm间距的转接排线一头是20针母头接JLink另一头分成两路——一路10针SWD调试口一路4针UART串口VCC、GND、TXD、RXD。这样在调试不同板子时只用一根线就能连好所有必要接口。制作方法很简单拿一个20针2.54mm母头按引脚定义焊上对应的SWD四根线VTref、SWDIO、SWCLK、GND和串口三根线TXD、RXD、GND另一端分别用2.54mm排针引出。全程只需要一把电烙铁和几分钟时间但对日常调试的效率提升非常明显。9. 最后的经验总结与技术建议把VCOM功能用熟之后我回头看整个过程其实技术门槛很低真正难的是知道有这个东西以及知道怎么排查问题。JLink Commander里vcom enable一条命令背后涉及USB CDC类协议、JLink固件设计、Windows驱动枚举机制等一系列基础概念只有把这些底层逻辑理清楚遇到问题才能快速定位。这里再补充几个容易踩的小细节部分JLink的SWD调试VCOM同时使用时如果目标板电流很大JLink引脚输出的3.3V供电能力有限通常小于300mA不要让JLink给整个板子供电否则可能触发过流保护导致调试中断。vcom enable命令在JLink Commander中不需要连接目标芯片就能执行但如果JLink连接了目标板且目标板处于复位状态建议恢复运行后再操作。设备管理器里COM口的编号是动态的如果同时插了两个JLink它们的VCOM端口号会随机分配。需要固定端口号的话可以在设备管理器里手动把COM口改成指定编号具体操作为右键端口—属性—端口设置—高级—COM端口号。系统会记住设备对应的COM号下次插入时沿用。对我个人而言VCOM这个功能解决得最漂亮的痛点是当你在野外、厂房、客户现场带着电脑和JLink却忘了带USB转TTL模块时它让你有了一张兜底的牌。那种手头有设备却干不了活的窘迫只要体验过一次就会把JLink的VCOM功能当成必备技能记在心里。如果你手头正好有JLink建议现在就去试试。打开JLink Commander输入vcom enable重新插拔看看设备管理器里多出来的那个COM口然后随手跟目标板连两根线发个数据——这个过程花不了五分钟但从此你的串口工具箱里就多了一个不占地方、永远在线、随时可用的隐藏串口。
返回列表