USB控制的微波毫米波组件:从选型到自动化测试实践 📅 发布时间:2026/8/27 8:17:10 👁 浏览次数: 先聊个项目背景。上个月我带着一箱刚开封的USB控制的微波毫米波组件回实验室里面有K波段开关、一个6dB可调衰减器、一个60GHz倍频源模块全是USB Type-C口插上电脑就识别成串口。说实话这种设备的普及比我预想中快得多。前几年做毫米波测试仪器面板上不是GPIB就是LAN口走线粗、驱动重、上位机封装复杂每次搭建一套自动化测试系统都像搞工程基建。现在新的微波毫米波组件直接用USB口控制驱动装上之后就是一条虚拟串口指令照发状态照读整个测试台架清爽了不止一个量级。这篇文章就围绕USB控制的微波毫米波组件把我在选型、驱动、通信、上位机开发、现场排障里沉淀下来的经验完整写出来给正在做射频自动化测试、组件评估或想改造旧产线的人做个参考。1. 为什么是USB给微波毫米波组件装上USB口背后的设计逻辑1.1 从GPIB/网口到USB测试台架的接口演变早年的射频器件控制接口大概经历了三个时代。最早的是GPIBIEEE-488总线一根扁扁的24芯线终端地址要通过拨码开关设置PC端得插一张GPIB卡或者用GPIB-USB转接器。GPIB协议本身很可靠适合仪器仪表但线缆粗、连接器大、成本高在如今模块化、小型化的射频前端里GPIB接口根本塞不进一个巴掌大的毫米波倍频模块里。后面出现了LAN口基于SCPI-over-TCP/IP传输距离长可组网控制多台设备但LAN口对设备来说依然需要一颗以太网PHY和TCP/IP协议栈功耗和BOM成本都不低而且IP地址分配、防火墙、端口占用这类问题在产线里也经常让人头疼。对很多无源或有源组件来说LAN口属于“杀鸡用牛刀”。USB接口的逻辑完全不同。USB从设计之初就是一个面向外设的通用串行总线天生为“外置设备接入主机”而存在。对射频组件厂商而言在模块里放一颗USB转串口桥接芯片或者直接用自带USB Device控制器的MCU就能把组件变成电脑的一个外设不需要额外电源线很多组件本来就是5V或3.3V供电也不需要复杂的网络配置。USB的即插即用、热插拔特性使得组件可以像一个鼠标一样被电脑识别和管理。在测试测量场景里USB还有天然优势可以级联HUB一个USB口扩展出多路控制支持同时连接多个被测组件这对自动化测试系统来说非常友好。1.2 USB控制给组件带来的三个直接影响第一个影响是体积和成本。老的GPIB接口几乎占据一块PCB的一半面积LAN口的隔离变压器、连接器和PHY芯片也需要大量板级资源。USB接口方案中一颗FT232R或者CP2102N芯片加一个Micro-B/Type-C座总占位不超过一个指甲盖大小。以我手头这块K波段开关模块为例板上主控用的是STM32F407内部自带USB OTG控制器外接一颗晶振和一个ESD保护二极管整个控制电路比射频链路本身还简洁。第二个影响是自动化测试的门槛显著降低。以前做毫米波组件批量测试至少要在工控机里插一张GPIB卡再买几根GPIB线成本几千块起步而且GPIB地址和线缆拓扑经常出问题。改用USB之后每个组件就是电脑上的一个COM口Python的pyserial库或者LabVIEW的VISA函数库都能直接访问几百块的USB HUB就能扩展出十几条控制通道自动化测试系统的成本结构完全不一样了。第三个影响是调试体验的改善。USB虚拟串口和HID设备在系统层面有很成熟的驱动栈Windows、Linux、macOS都有原生或半原生的支持。我在Linux下直接lsusb、dmesg一看就能识别到设备然后用minicom或者python脚本收发指令整个调试链路比GPIB时代灵巧太多。这种体验上的差距会让硬件工程师和测试工程师都更愿意把USB作为首选控制口。2. 拆解USB控制链组件内部到底怎么跟电脑通信2.1 桥接芯片选型FT232R/FT231X、CP2102N、CH340这些USB转串口芯片怎么选打开任何一台USB控制的微波毫米波组件很大概率能看到一颗USB转UART桥接芯片或者一颗内置USB控制器的MCU。桥接芯片之所以常见是因为射频组件内部已经有一个负责状态切换、衰减步进、温度补偿的MCU这颗MCU原本就有UART外设如果能通过一颗成熟的USB-UART芯片把UART转成USB开发量最小固件也不需要改太多。实际选型时我看到的主流方案有FT231X、FT232R、CP2102N和CH340。FT232R是经典款单芯片方案内置EEPROM可以把USB VID/PID、序列号、字符串描述符烧录进去。很多设备厂商会申请自己专用的VID/PID比如我手头的毫米波衰减器说明书里就写着厂商自定义的USB\VID_1234这样才能做到“装专用驱动而不是公版驱动”。FT231X是FT232R的新一代支持更高的UART波特率最高3Mbps封装更小。CP2102N是Silicon Labs的方案内置晶振不需要外部时钟所以BOM更精简它的驱动在Windows下会自动识别成“CP2102N USB to UART Bridge”在Linux下会识别成ttyUSB0。CH340是国内用得很多的高性价比方案芯片便宜但驱动稳定性在一些工业场景里略有争议尤其是长时间高并发通信时偶尔会有掉线问题。如果是自己设计组件我建议优先用FT231X或CP2102N生态成熟、驱动正规工业级可靠性有保障如果是采购组件看到CH340也不算坏消息但最好先验机。这里有一个很容易被忽略的点桥接芯片虽然是USB转串口但USB端和UART端的流控策略很关键。很多工程师以为只要PC端打开COM口就能收发实际上毫米波组件的控制指令往往很短几十个字节速率要求不高但时序要求严格。像FT232R这类芯片内部的TX/RX FIFO是有限深度的如果上位机一次性灌入大批量指令而组件MCU的UART没有开启流控很容易丢字节。在配置虚拟串口时建议把流控选项设置成RTS/CTS硬件流控或者至少在固件端使用查询式读取而不是中断积压。2.2 不只是串口USB CDC、USB HID、USB DFU各自适合什么场景USB桥接芯片最常用的是把USB枚举成“USB to UART”设备这种设备属于USB通信设备类CDC。但还有一些新的毫米波组件直接用USB HID协议通信。HID类设备最出名的当然是鼠标键盘它的特点是免驱、即插即用任何操作系统都自带HID驱动。如果射频组件的控制协议足够简单比如只发送几个字节的开关量用HID就有优势不需要安装厂商驱动也不用担心串口号漂移。但HID的缺点是传输效率不如CDC批量传输的速率上限也偏低不太适合需要持续回传大块波形数据的场景。我见过一个雷达目标模拟器的毫米波前端就是用HID接口发送控制报文上位机用Windows的HID API读写稳定运行了很久。USB DFUDevice Firmware Upgrade是另一个很容易被搜索到的关键词。很多新组件都支持DFU升级固件不需要额外的编程器。STM32系列芯片的DFU模式通常通过USB枚举成一个DFU设备然后使用配套工具烧录固件。实际使用中进入DFU模式的方法五花八门有的组件要求在上电瞬间按住按键有的通过串口发送特定指令有的则是检测到USB枚举失败后自动进入DFU。排查这类问题的时候建议先用USB Device Tree Viewer看看设备枚举出来的接口描述符确认是否进入了正确的DFU模式。如果设备被识别成一个未知设备或者显示“无法识别的USB设备”大概率是供电不够或者USB线质量差而不是固件坏了。2.3 Host与Device模式要注意的坑另外一个高频话题是USB Host模式和Device模式的区别。组件里的USB接口绝大多数情况下是Device模式它作为从机被PC、嵌入式主机或手机连接。如果你在系统里看到“USB Host模式”的选项那是指这个设备可以主动插入U盘、读卡器或者挂载其他USB外设。比如有些高端信号分析仪前面板有USB Host口可以插U盘存波形有些组件带有USB Host口可以外接一个USB转TTL的调试模块。这两种模式在硬件连接上完全不同Device模式通常需要上行接口连接HostHost模式则需要对外的下行接口连接Device。做系统集成时如果误把组件当成Host去接U盘大概率没什么反应因为枚举方向反了。在STM32这类MCU上USB OTG控制器可以通过ID引脚自动切换模式但射频组件一般固定做Device不会让你动态切换。3. 到手第一步驱动安装与设备枚举排查3.1 手把手看VID/PID识别芯片新组件到手第一步是插上电脑看设备是否被正确识别。Windows下打开设备管理器展开“端口COM和LPT”或者“通用串行总线控制器”如果组件是USB转串口方案正常会显示“USB Serial Port (COMx)”或者芯片厂商的名字。如果显示黄色感叹号说明驱动有问题这时候先别急着装驱动右键设备属性切到“详细信息”选项卡把“硬件ID”导出来你会看到类似这样的字符串USB\VID_0403PID_6001USB\VID_10C4PID_EA60VID是厂商ID0403是FTDI10C4是Silicon Labs1A86是CH340厂商。PID是产品ID比如6001是FT232R的经典PIDEA60是CP2102系列常用PID。看到这个信息后基本可以判断芯片型号再去官网下载对应的驱动。有经验的工程师会养成一个好习惯每拿到一个USB设备先在设备管理器里把硬件ID截图存档。这样后续设备识别异常时可以快速排除是不是驱动被覆盖或设备固件描述符变化导致的问题。3.2 驱动装不上的常见原因驱动装不上的原因我总结下来主要有四类。第一类是电源不足。USB 2.0标准口最大输出500mAUSB 3.0是900mA但很多工业电脑的前置USB口经过内部HUB再转接后实际供电能力可能不足。毫米波组件如果内部有源倍频链路功耗可能在300mA到800mA之间再叠加USB转串口电路的功耗很容易拉低电压导致枚举失败。症状就是插上后设备管理器里设备反复“叮咚”断开、重连。解决办法是换一个供电充足的USB口或者使用带外部供电的USB HUB。第二类是USB线质量问题。USB线并不是“能传数据就行”组件对信号完整性要求高时劣质线材会让高速信号抖动过大。控制类USB设备一般跑Full Speed12Mbps对线材要求不算高但有些厂商为了省成本用普通充电线只有电源线没有数据线D/D-自然识别不到。此外线长超过2米时建议选用带磁环的屏蔽线并避免与交流电源线、射频输出线并行缠绕。第三类是驱动签名或系统版本问题。新版Windows系统对驱动签名要求严格如果一个芯片厂商的驱动没通过WHQL认证或者你下载的是旧版驱动系统会拒绝加载。这时需要在启动高级选项里临时禁用驱动程序强制签名但这不是长久之计最好还是去官网下载最新签名驱动。32位和64位驱动也容易搞混好多实验室里还在用老旧的32位工控机务必对应下载。第四类是COM口号被占用或冲突。USB虚拟串口每次插入不同的USB口系统可能会分配一个不同的COM号有些老旧上位机软件只认固定的COM3结果插拔几次后COM3被另一台蓝牙设备占用了程序就连不上。解决办法是在设备管理器里把当前设备的“高级”设置中的COM端口号手动改为固定值。我在产线里一般都把每台组件固定在一个USB口并把COM号锁死减少变量。3.3 USB Device Tree Viewer与Wireshark USB抓包调试USB设备光靠设备管理器远远不够。我强烈推荐两个工具USB Device Tree Viewer和Wireshark带USBPcap扩展。前者可以查看整个USB设备树包含控制器、HUB、端口的拓扑结构以及每个设备的配置描述符、接口描述符、端点描述符。当你怀疑组件枚举不正常时用这个工具能看到设备究竟枚举成了什么类、有几个接口、端点管道参数是否正确。比如一个正常枚举的CDC设备Device Tree Viewer里会显示接口类为“CDC Data”或者“Communications”如果你看到一个“Bad Device”或者设备节点下面没有任何接口说明设备描述符回传有问题大概率是固件或硬件电气问题。Wireshark配合USBPcap抓包则是另一种境界。它能在USB总线上抓取URBUSB Request Block级别的数据看到主机和设备之间的SETUP、IN/OUT事务。不过这需要管理员权限而且抓包范围是整个USB控制器也就是同一控制器下的所有设备数据都会被抓到所以最好单独接一个HUB来隔离目标设备。实际调试中我用Wireshark解决过一个最头疼的问题组件返回数据总是少前两个字节。百思不得其解后来抓取URB一看发现上位机发送的指令包被USB HUB转发时被截断了。换了个HUB之后问题消失。这种问题在逻辑分析仪上很难发现但Wireshark的URB数据直接暴露了问题。4. 上位机开发与控制协议设计4.1 最简控制指令设计从“单命令-单响应”开始拿到USB控制的微波毫米波组件后上位机开发的第一步不是写界面而是确认指令协议。大多数厂商会提供一份SCPI子集或者私有指令集。比如一个K波段开关模块通信格式可能是发送“SWITCH:PORT 2\n”返回“OK\n”发送“SWITCH:STATUS?\n”返回“PORT 2\n”。开发时建议遵守以下规则每条指令以换行符\n或者\r\n结尾方便解析。组件端响应必须带明确结束符避免上位机阻塞等待。指令尽量短小、无歧义不要搞长命令名。预留广播地址或设备ID为多设备级联做准备。如果是从零设计协议我建议参考SCPI的基本思想但不求完整。一个最简协议只需要三类指令查询身份IDN?、设置参数SET、读取状态STATUS?。比如IDN?\n FREQ:SET 60000MHz\n POW:READ?\n我把这些指令放到一个枚举表里然后用switch-case解析不仅组件端代码简单上位机端跑起来也非常稳定。4.2 用Python实现组件控制pySerial读写实例Windows下最常用的上位机方案是Python pySerial或者LabVIEW VISA。先看Python版本下面这段代码是我在测试毫米波倍频源模块时用过的骨架import serial import time PORT COM3 BAUDRATE 115200 ser serial.Serial( portPORT, baudrateBAUDRATE, bytesizeserial.EIGHTBITS, parityserial.PARITY_NONE, stopbitsserial.STOPBITS_ONE, timeout0.5, write_timeout1.0, ) def send_cmd(cmd: str) - str: ser.reset_input_buffer() payload (cmd.strip() \n).encode(ascii) ser.write(payload) resp ser.readline().decode(ascii, errorsignore).strip() return resp if __name__ __main__: print(send_cmd(*IDN?)) print(send_cmd(FREQ:SET 60000MHz)) print(send_cmd(POW:READ?)) ser.close()这段代码里有几个细节值得注意。第一每次发送前调用reset_input_buffer清空上一次的残留数据防止响应串包。第二write_timeout一定要设置防止串口被堵死。第三readline依赖超时如果组件响应慢需要调整timeout参数但不要把timeout设得太长否则批量扫描时效率低。第四如果组件返回的是二进制或者非ASCII字符统一用bytes类型操作会更安全。批量控制多个组件时不要简单地开多个串口。如果CPU不强多线程串口并行会导致丢指令。我常用的做法是“串行加轮询”用一个循环列表轮流给每个设备发送指令每个指令间隔5到10毫秒。对多数毫米波组件而言这个速度足够。如果确实需要真正并行可以使用线程池但每个线程里的串口对象必须独立且不要在线程之间共享同一个串口实例。4.3 数据采集与校准功率计/频率计如何对齐时间戳USB控制的组件不只是用来设置开关和衰减器更多时候还要回传状态数。比如组件内置了温度补偿可能会回传一个温度报文或者组件内部集成了检波器能直接回传功率读数。回传数据最麻烦的是时间同步。射频测试讲究“测量瞬间的状态”如果上位机在t1时刻发送“POW:READ?”在t2时刻收到响应但组件内部在t1.5时刻做了功率切换那么读到的数据就“不是当前状态”。解决办法是在组件固件里为每次回传打上时间戳或者在上位机端以“发指令-收响应”的间隔作为数据有效区间。对大多数应用来说上位机同步的精度已经足够。我做过一个扫描测试每10ms发一次频率设置指令紧接着发一次功率读取指令实测串口吞吐量只有约20KB/sUSB虚拟串口的延迟抖动在几毫秒级别对一般毫米波功率测试完全够用。如果要求微秒级同步就必须让组件支持PPS或者外触发电平USB主从结构本身并不适合高精度实时控制。校准是另一个必须考虑的问题。USB控制的毫米波组件在出厂时会做校准把频率误差、插损、功率修正系数写入EEPROM或Flash。PC端读取这些校准参数后真实值设定值校准误差。协议里最好提供校准系数的读写指令比如“CAL:READ:FREQ?”等。我曾遇到组件在校准后偏离标称值排查发现是校准参数存在Flash中的地址被固件升级覆盖了。所以固件升级后一定要重新校准或者至少读取校准版本号进行校验。5. 实操案例搭建一套USB控制的毫米波测试系统5.1 硬件连接我最近搭建了一套67GHz频率范围的毫米波链路损耗测试平台。核心设备包括一台USB控制的毫米波信号源倍频模块、一台USB控制的程控衰减器、一台USB控制的波导开关以及一台传统台式频谱仪。这套系统的亮点是除了频谱仪所有组件都通过USB进行控制并且全部挂在同一个USB HUB上。硬件拓扑工控机Windows 10一个USB 3.0口外接一个带外部供电的7口USB 2.0 HUB。信号源模块、衰减器模块、开关模块的USB口分别接到HUB上。射频链路为信号源输出 - 波导开关 - 被测器件 - 程控衰减器 - 频谱仪。所有USB线使用0.5米带磁环屏蔽线USB HUB和射频链路保持至少10cm距离避免开关切换瞬间的数字噪声耦合进射频路径。这里有两点经验。一是USB HUB必须带外部供电否则三个模块同时工作电流很容易超过主机单口供电能力。二是在波导开关切换时建议先给衰减器设置一个较大的衰减值比如30dB等开关稳定后再恢复到正常衰减。这是为了防止开关切换瞬间的反射信号烧坏后端频谱仪。5.2 软件流程软件部分我用Python写了一个主控脚本。流程大致是枚举所有已连接的USB组件逐个发送IDN?确认身份。根据测试计划设置信号源频率、功率和开关路径。每次切换后等待20ms稳定时间再读取衰减器回传的状态。控制频谱仪通过GPIB-USB转接器读取峰值功率传统仪器没法用USB就保留GPIB。计算链路损耗写入CSV。核心循环示例freqs [60000, 61000, 62000, 63000, 64000, 65000] # MHz atten_set [0, 10, 20, 30, 40, 50, 60] for f in freqs: src.send_cmd(fFREQ:SET {f}MHz) switch.send_cmd(SWITCH:PORT 1) time.sleep(0.02) for att in atten_set: atten.send_cmd(fATT:SET {att}) time.sleep(0.02) src.send_cmd(RF:ON) time.sleep(0.05) power spectrum.read_power() record.append((f, att, power)) src.send_cmd(RF:OFF) time.sleep(0.02)代码看着简单但实际运行中遇到了一个很典型的“USB控制时序问题”如果在RF:ON之后立即读取功率电平还没稳定读到的数据每次都不一样。后来把RF:ON到读取之间的延时从5ms加大到50ms数据才稳定。这件事说明USB控制链路的延迟虽然低但射频器件本身的建立时间才是关键不能把时间预算全部花在串口上。5.3 验证结果最终测试跑了6个频点、7个衰减档位共42个数据点耗时约3分钟。如果每个操作之间加了足够延时一次完整扫描在5分钟以内。整个过程中USB HUB上的三个组件没有一次掉线串口状态稳定。测试结果链路插损的重复性在0.1dB以内满足产线快速检查的需求。相比原来用GPIB转接器手动切换这套USB方案确实省了很多时间和空间。6. 常见问题与排查技巧实录6.1 问题速查表下面这张表是我在实际使用USB控制的微波毫米波组件时见过的问题清单排序按出现频率。问题现象可能原因排查方法解决办法插上电脑无任何反应线材只有电源无数据换一根已知良好的USB数据线换线避免充电线设备管理器显示“未知USB设备”供电不足或D/D-短路USB Device Tree Viewer看设备状态换供电充足口/外接USB HUB识别成COM口但打不开串口被其他程序占用关闭所有可能占用的软件关掉串口助手再试设备能打开但指令无响应波特率不匹配查阅组件手册确认默认波特率设置对应波特率返回数据乱码通信参数配置错误检查数据位/停止位/校验位统一为8-N-1组件偶尔掉线USB线过长/电磁干扰缩短线长远离射频大功率走线换短屏蔽线加磁环多设备同时操作时丢指令USB HUB带宽不足或供电不足抓取URB看延迟换取有源HUB减少并发固件升级后驱动异常固件内描述符被改变查看硬件ID和接口类重装对应驱动或恢复出厂固件HID设备发送失败报告ID或缓冲区大小不匹配查看设备描述符的HID报告描述符在上位机按报告ID和长度发送USB口插拔后COM号变化系统动态分配COM号查看设备管理器中COM映射手动固定COM号设备在Linux下识别为/dev/ttyUSB0但无权限当前用户不在dialout组ls -l /dev/ttyUSB0sudo usermod -aG dialout $USER重新登录6.2 独家避坑经验接下来是我个人积累的几条非标准但特别实用的经验常规文档里基本不会写。第一USB控制线的接地环路问题比想象中严重。毫米波组件的外壳往往通过射频连接器和测试系统结构件相连而USB线的GND又和工控机相连。如果系统里有多个接地路径容易形成地环路轻则通信误码重则USB口烧毁。我在机架搭建时会在组件外壳和系统结构件之间加绝缘垫片然后用USB线的GND作为唯一数字地参考这样可以避免大多数地环路问题。第二热插拔USB控制设备时先断开射频信号。很多人习惯“插拔USB嘴射频不停”但组件控制接口在枚举瞬间会产生较大的电流冲击可能导致内部逻辑复位或射频开关瞬间误动作。如果此时有大功率信号输入轻则测量数据异常重则损坏内部射频芯片。稳妥的流程是先关闭射频源再插拔USB。第三别迷信USB 3.0。USB 3.0接口能兼容USB 2.0设备但有些USB 3.0控制器的内部布局会对USB 2.0信号质量产生干扰尤其是低价的扩展卡。如果设备偶尔枚举失败插到USB 2.0口上反而稳定。我在旧工控机上实测过同一个组件在原生USB 2.0口上连续运行48小时不掉线而插在USB 3.0口上一天掉两次。原因是底层Hub的链路状态切换导致挂起。所以产线设备最好统一使用USB 2.0口或者把USB 3.0口设置成不睡眠。第四做多组件系统时给每根USB线贴上设备标签并且在系统里固定COM号与设备序列号的映射关系。USB转串口芯片的EEPROM里通常可以写入序列号厂商一般会写但如果没有序列号每次插拔顺序变化都可能改变设备枚举顺序。上位机初始化时不要依赖COM口号而应该遍历所有COM口发送IDN?后用返回值里的设备ID来识别设备。这样即使USB线插错顺序程序也能自动匹配。第五注意USB控制器休眠问题。Windows默认允许系统关闭USB设备以节省电源这会导致设备在长时间空闲后掉线。解决办法是在设备管理器中找到“USB根集线器”和具体设备在“电源管理”页签里取消“允许计算机关闭此设备以节约电源”的勾选。特别是跑长时间老化测试时这个设置必须检查。第六当你在Linux下遇到设备枚举但无法通信时可以用命令检查USB描述符和端口地址lsusb -v -d 0403:6001 dmesg | tail -20 sudo modprobe ftdi_sio ls /dev/ttyUSB*dmesg里如果出现“usb 1-1.3: FTDI USB Serial Device converter now attached to ttyUSB0”说明驱动正常。如果出现“Ignored”或“No configuration chosen”说明设备配置阶段出错大概率是供电或信号质量。7. 从组件到系统USB控制的毫米波组件如何改变测试方法USB控制带来的不只是接口形态变化更深远的影响是让微波毫米波组件从“黑盒子”变成了“软件定义模块”。过去一个60GHz开关面板上是一排无法监控的机械旋钮现在通过USB你可以在PC上实时知道每个开关的位置、温度、状态甚至捕获切换瞬间的射频包络。这种能力让自动化测试、远程维护和产线数据追溯都变得容易得多。我在做这套系统的过程中越来越觉得USB是毫米波测试领域最被低估的接口。它的实时性比不上PXIe总线的低延迟同步但在“参数配置-状态回读”这一层USB的易用性和普适性远高于其他控制接口。尤其是新的USB Type-C连接器机械强度好、插拔方向无所谓、还能为组件提供5V供电将来会有越来越多毫米波组件直接用USB Type-C作为唯一的控制与供电端口。最后再分享一个实操中的小技巧如果你有多个组件需要同时控制最好在USB HUB的每个端口上做编号并且在组件固件里支持“地址模式”。比如发送“2 SWITCH:PORT 3”可以让地址为2的开关切换到端口3。这样一个上位机进程通过一条串口总线通过HUB虚拟成多COM口就能管理多个设备。你可以在上位机初始化时扫描各COM口给每个设备分配一个逻辑地址然后所有通信都带地址前缀。很多国产毫米波组件已经开始支持这种设计确实能省不少事。如果你刚开始接触USB控制的微波毫米波组件我建议挑一个带明确指令集、支持虚拟串口、驱动成熟的产品先上手配合Python脚本跑一遍基础的状态查询你会很快理解这套控制链路的爽点。