LabVIEW连接泰克示波器:VISA与SCPI编程实战指南
简介这份 LabVIEW 连接泰克示波器范例面向从事电子测试与信号分析、希望用 LabVIEW 远程控制示波器并实现自动化测量的工程师适用于从基础功能连接到批量自动化测试的进阶场景。压缩包共包含166个文件以153个 vi 程序文件为核心辅以菜单配置、自定义控件、工程与库文件及说明文档完整呈现了从设备连接、参数配置到波形采集与存储的编程流程整体大小约2.73MB便于快速定位所需模块。已有2534人学习下载。范例覆盖远程控制、波形采集、数值计算与自定义界面等关键环节并针对泰克 DPO/MSO 2000/4000 系列整理了相关驱动与接口资料可帮助读者理解 VISA、GPIB、USB 等通信方式减少环境搭建与排错时间适合需要快速上手仪器控制或开展重复性测量任务的开发者在实际项目中直接参考与扩展。1. LabVIEW 连接操作泰克示波器范例先搞清楚 VISA 和 SCPI 的分工把示波器从“手动按按键”变成“上位机可编程”这是很多自动化测试项目的起点。这套 LabVIEW 连接操作泰克示波器范例的核心并不是某个高级波形处理算法而是把所有操作收敛成两条线索底层用 VISA 管理连接与数据传输上层用 SCPI 指令描述“我想让示波器做什么”。范例已经写出了连接泰克示波器的标准流程包括设备初始化、通道和触发设置、测量读取、波形回读等足够让一个测试工位的采集功能跑起来。适合刚开始用 LabVIEW 写仪器控制的开发者也适合不想被厂商驱动绑定的老手。它解决的核心诉求很简单连上设备、稳定取数、少踩隐藏的坑。2. 连接泰克示波器VISA 资源名、初始化顺序与验证在这个例子的所有问题里连接阶段占一半。仪器连上了后面都可以用 SCPI 指令一步步试连接建立不起来看代码像看黑匣子。因此先把连接这件事说透。2.1 三种连接方式GPIB、USB、LAN 的资源名差异泰克示波器对外提供的不只是一个物理接口。常见连接有 GPIB、USB 和 LAN在 VISA 里三者的资源名格式完全不同范例里最容易改错的就是这一项。接口VISA 资源名示例适用场景GPIBGPIB0::1::INSTR老型号示波器、机架多台级联USBUSB0::0x0699::0x0403::C019518::INSTR单台电脑直连调试最方便LANTCPIP0::192.168.1.2::inst0::INSTR远程放置、产线多工位先看 USB。资源名里的0x0699是泰克设备的厂商 ID后面0x0403是产品 ID最后的序列号每台机器都不一样。最稳的写法不是手打而是在仪器管理器里选中该设备右键复制资源名。曾有同行看范例里有个C019518以为自己这台也要写同样字符结果一直报设备不存在其实只要替换成自己设备的序列号即可。LAN 连接的资源名要注意支持 VXI-11 的型号用TCPIP0::地址::inst0::INSTR某些只开放 raw socket 的型号或配置下要写成TCPIP0::192.168.1.2::5025::SOCKET。这两种写进 VISA 资源名后程序走的是完全不同的协议栈。常见做法是先在电脑上用命令行 ping 通仪表 IP再在仪器管理器里看是识别为TCPIP0还是Socket按识别结果填资源名。GPIB 相对简单GPIB 地址一般可以从示波器菜单里读到。多台设备级联时还要注意每个 GPIB 适配器地址冲突范例里通常会把 GPIB 地址做成输入控件而不是写死在程序里。我一般也会在 VISA 资源名控件旁边加一个下拉列表把三种连接方式都放进去切换时只换字符串不用改代码逻辑。2.2 初始化顺序先复位再查身份最后设超时连接建立之后程序最容易被坑的是“顺序”。示波器上一次运行留下的触发状态、通道开启状态和错误队列都会影响当前测量结果。范例中的初始化步骤可以归纳为三步# 与 LabVIEW VISA 节点等价的文本逻辑 visa_write(*RST) # 复位恢复默认状态消除上一次残留 visa_write(*CLS) # 清空错误队列与事件寄存器 idn visa_query(*IDN?) # 身份查询验证链路是否通顺序为什么这么排*RST会改变设备状态并可能产生事件消息如果不清空后续读取 *IDN? 时可能混入错误标志*CLS专门负责清理这些。在 LabVIEW 的实现上就是按上面的顺序先后执行 VISA Write 和 VISA Read 节点中间不需要另外做延时。若示波器型号较老*RST执行时间可能超过 1 秒建议在复位后加一个 200ms 的等待而不是马上发下一条命令。超时参数容易被忽略。VISA 节点默认超时常在 2000ms 左右示波器在做自动设置或长记录回读时很容易超过这个时间我一般在打开 VISA 会话后通过属性节点把 Timeout 设为 5000ms。这个值不是越大越好设成 30 秒会让程序在设备异常时长时间卡住。5 秒是一个兼顾稳定性与响应速度的经验值。2.3 验证连接把 *IDN? 返回内容拆开看*IDN?是 SCPI 里最常见的握手指令返回的是一段逗号分隔的字符串。把它拆开看设备信息能立刻判断连接到的确实是目标设备而不是隔壁工位误接的机器idn idn.strip() # 去掉设备返回的换行符 parts idn.split(,) manufacturer parts[0] # 第一段一般是 TEKTRONIX model parts[1] # 第二段是型号 serial parts[2] # 第三段是序列号 fw parts[3] # 第四段是固件版本在 LabVIEW 里对应做法是用Scan From String按逗号和换行符拆分字段。如果第一段不是 TEK 字样说明资源名占用了别的设备如果返回的全是空字符串多数是读取缓冲区或超时设置有问题。我曾遇到一个奇怪情况设备管理器里明明能看到示波器代码一执行*IDN?就超时后来发现是该型号的 LAN 端口被另一个软件占用关掉那个会话后立刻恢复正常。因此验证连接不要只看 VISA Open 是否成功一定要读一次*IDN?并把内容显示到前面板这一步能把后面大部分玄学问题挡在门外。3. SCPI 指令与控制流程测量、波形读取和参数解析连接稳定后剩下的是让示波器按测试要求工作。泰克示波器支持完整的 SCPI 指令树但日常测量真正用到的命令并不多。范例把“设置测量条件、获取波形数据、解析回读结果”三个环节串起来形成一条可重复执行的链路。3.1 常用 SCPI 命令通道、触发和测量的先后关系自动化测试里不要一上来就发自动设置命令。:AUTOSET虽然能快速显示波形但会擅自改变垂直刻度和水平时基导致后续测量结果不稳定。范例里的写法是先固定测量条件再控制触发。目的命令说明垂直刻度:CH1:SCAle 0.5CH1 每格 0.5V水平时基:TIMebase:SCAle 0.001每格 1ms触发源:TRIGger:A:EDGE:SOURce CH1边沿触发通道选 CH1触发电平:TRIGger:A:LEVel 0.2触发点设在 0.2V测量类型:MEASUrement:MEAS1:TYPE PK2PK测峰峰值测量通道:MEASUrement:MEAS1:SOU CH1测量的目标通道开启测量:MEASUrement:MEAS1:STATE ON让测量持续运行顺序上先配置垂直和水平再配置触发最后配置测量。如果先测量后改量程示波器会自动重新测量但这中间可能产生一次跳变。触发配置尤其关键触发电平设置不当信号触不到测量值会长时间不更新。参数里的单位不需要写数字后缀用E计数也行比如1E-3。这部分在 LabVIEW 里是 VISA Write 节点的输入字符串建议把参数做成前面板控件调试时不用改代码。3.2 读取完整波形从源通道到二进制格式的四步流程读取波形曲线是这类范例的另一个重点。SCPI 读取完整波形有固定四步漏一步就会出现“有数据但不对”的情况。# 第一步选择波形数据源通道 visa_write(:DAT:SOU CH1) # 第二步设定记录模式NORM 表示屏幕显示的点 visa_write(:WAV:MODE NORM) # 第三步设定数据格式ASCII 最直观BYTE 最快 visa_write(:WAV:FORM ASCII) # 第四步设定首尾点序号1 是起始点 visa_write(:WAV:STAR 1) visa_write(:WAV:STOP 2000) # 执行查询拿到逗号分隔的电流数据 curve visa_query(:CURVE?)注意泰克 SCPI 的波形点序号从 1 开始计数LabVIEW 数组下标从 0 开始后续拷贝到数组时要记得做偏移。NORM和MAX的差异要牢记。NORM 只返回当前显示缓冲区的点放大波形后点数会大幅减少如果需要完整记录长度应把模式改成MAX或设备支持的RAW并提前用:WAV:POIN?查询实际记录点数。如果直接把 STOP 设成一个固定的 2000忽略真实点数末尾数据会丢失。ASCII和BYTE的选择属于性能换可读性。ASCII 模式下:CURVE?返回的是类似1.23E-3,2.34E-3...的文本解析简单但传输量大当波形点数上万一次读取会明显变慢。我一般在批量产线测试时改用:WAV:FORM BYTE再用 VISA 底层读取字节流并且先用:CURVE?返回的头信息解析数据长度。LabVIEW 里对应的做法是改用二进制读取节点不要用字符串读取函数。STAR与STOP的设定也有讲究。泰克 SCPI 的波形点序号从 1 开始这点和数组下标从 0 开始不一样。如果设置的范围超过了实际记录长度示波器会返回空数据或报错。保守做法是查询:WAV:POIN?后再把 STOP 设置为该值。3.3 字符串转数值LabVIEW 里最容易翻车的解析细节从:CURVE?拿回来的文本本质是一串用逗号分隔的浮点数字符串。解析思路直接。raw curve.rstrip() # 去掉结尾换行 values [float(v) for v in raw.split(,)]在 LabVIEW 里有两种做法。第一种是Scan From String配合%f格式符循环扫描直到字符串结束第二种是先用Split String按逗号分成子字符串数组再用Fract/Exp String To Number转换。我习惯用后一种因为前面板能看到分割后的数组方便排查是哪个点出了问题。这里有几个经验点。第一示波器返回字符串末尾通常带换行符解析前必须Trim Whitespace否则最后一位会多一个\n。第二VISA Read的缓冲区长度要足够范例程序里如果缓冲区只有 512 字节一次读取一个几 KB 的曲线文本会被截断解析结果莫名其妙少一段。一般把 VISA 读取缓冲区设为 256KB 以上然后用VISA Bytes at Port属性判断实际返回字节数。第三二进制格式不能直接接到字符串显示控件否则会看到乱码正确做法是先用一个整型数组接住字节流再按示波器文档把两个字节拼成一个 16 位整数最后乘上垂直缩放因子。这部分才是真正的血泪经验第一次用 BYTE 模式时我的数组里全是 65535 和 0折腾半天才发现少处理了高低字节顺序。4. 避坑清单泰克示波器控制中常见的 5 个问题和修复范例能不能落地主要看它在真实工位上能不能稳住。下面 5 个问题是我在拆用类似工程时最常看到的翻车点每条都按现象、原因、解决给出来。4.1 设备枚举正常但 VISA 操作超时现象电脑能识别出泰克示波器VISA Open 也返回成功但一执行*IDN?或者*RST就在读取节点处长时间等待最后弹出超时。原因多数情况下不是指令写错而是设备会话被其他程序占用或者 USB 线缆只支持充电不支持数据传输。还有一个隐蔽原因是 LAN 口的连接模式没有切换成 VXI-11TCPIP0 资源名和实际协议不匹配。解决先把设备从仪器管理器里删除重新刷新枚举用可以确定支持数据通信的 USB 线替换测试如果是 LAN 连接先用 ping 确认网络通再用TCPIP0::IP::5025::SOCKET作为后备资源名。初始化代码保持只打开一个 VISA 会话循环结束必须 VISA Close。4.2 回读波形点数比屏幕显示少很多现象示波器屏幕上一格 1000 点波形回读却只拿到 200 个点尝试扩大 STOP 参数返回点数不变。原因默认:WAV:MODE是NORM它只返回屏幕当前显示的点的子集。如果采集记录长度远大于显示宽度只有显示区域的数据会送到上位机。解决读取前设置:WAV:MODE MAX如果型号支持再设置:WAV:MODE RAW先用:WAV:POIN?查询真实点数再把 STOP 设置成这个值。同步检查仪器的采集长度设置记录长度太短时哪怕 MODE 改成 MAX 也拿不到长数据。4.3 ASCII 波形解析越来越慢现象数据量从几千点到几万点后循环读取一帧的时间从 200ms 涨到 1 秒以上整个测试节拍变慢。原因ASCII 传输本身要把每个浮点数转成文本字符传输和解析开销都比二进制大另外 LabVIEW 里用字符串转换函数逐点解析循环次数多了以后前面板刷新也成了瓶颈。解决把:WAV:FORM改为BYTE并使用二进制 VISA 读取转换时一次读取整块字节再用数组操作处理而不是逐点读逐点解析。同时关掉不必要的前面板波形图刷新或者让波形图每 10 帧更新一次。4.4 长时间运行后内存持续上涨现象程序刚启动时占用内存 80M连续跑 2 小时后涨到 500M最后系统开始卡顿。原因多数是循环内每帧都新建大数组旧数组没有释放或者前面板波形图控件默认保存历史数据导致数据量越积越多。还有就是 VISA 会话每次循环都重新打开却不关闭句柄泄漏。解决把 VISA Open 移到循环外循环内只做 Write/Read波形图控件把历史长度限制设为 0 或固定值用Replace Array Subset复用数组缓冲区避免每次生成新数组。这套范例运行时如果出现这个现象重点看前面板指示器是否拖了数据。4.5 测量值返回 NaN 或 -----现象触发和波形显示都正常但读取测量值函数时结果不是数字而是 NaN 或横线。原因测量通道没有配置或者测量功能没有开启只是定义了测量类型。有些泰克型号要求先启动测量任务再读测量值。解决按顺序执行:MEASUrement:MEAS1:SOU CH1、:MEASUrement:MEAS1:TYPE PK2PK、:MEASUrement:MEAS1:STATE ON然后等待 200ms 再执行:MEASUrement:MEAS1:VALue?。如果还是 NaN先手动在示波器屏幕上确认该测量项有数值排除硬件信号问题。5. 进阶把范例改造成可复用的示波器采集工具基本功能跑通之后这套范例可以再加一层状态机把它从“测试脚本”改造成“采集小工具”。5.1 用状态机管理采集流程仪器控制最忌讳在一个事件回调里同步执行读取。常见做法是维护一个枚举状态机初始化、等待触发、读取、落盘、错误恢复。状态流转的文本逻辑如下state INIT if state INIT: open_visa() init_scope() state ARM elif state ARM: arm_trigger() state WAIT_TRIGGER elif state WAIT_TRIGGER: read_curve() parse_waveform() state LOG elif state LOG: write_to_file(data) state ARM if not stop else DONE在 LabVIEW 里这就是一个 While 循环加条件结构加枚举适合把超时错误引到错误恢复状态。把每次读取数据封装成一个子 VI输入只有 VISA 资源名输出波形数组和状态码后面接任何测试序列都不用再重复写 VISA 代码。5.2 数据落盘和回读验证我习惯把每一帧波形和测量值一起写入 TDMS 文件文件名用时间戳命名同时记录通道刻度、时基和触发电平。回读验证时用一个已知方波信号源接到 CH1设定 1kHz、2Vpp程序读出的峰峰值应该在 2.0V ±1% 内。如果偏差超出回到第 3 章的垂直刻度参数检查而不是怀疑采集算法。以前在现场吃过一次亏直接在按钮事件里同步循环读取波形界面卡死测了一半才发现触发条件早就不满足。从那以后我每次写仪器控制程序都强制先走一遍状态机和超时异常分支再往里面填业务逻辑。说得直白点连接示波器不是玄学只是步骤不能乱这套范例正好把步骤排好了希望帮到你。本文还有配套的精品资源点击获取

相关新闻

GSWOA优化Elman网络:多输入单输出预测的精度与稳定性提升

GSWOA优化Elman网络:多输入单输出预测的精度与稳定性提升

前几天帮一位做设备状态监测的同事看了组数据:一堆传感器读数、环境变量在前面排着,后面只有一列要预测的目标值。他试过线性回归,效果惨不忍睹;又试了BP神经网络,好了一些,但每次换随机种子结果就飘得厉害…

2026/10/19 14:43:16 阅读更多 →
Artcraft:手工艺数字化的三层翻译方法论

Artcraft:手工艺数字化的三层翻译方法论

1. “Artcraft”不是新词,而是被长期误读的设计实践范式“Artcraft”这个词最近突然在设计类社区、创意工作坊和高校课程大纲里高频出现,但翻遍主流设计史文献、权威术语词典甚至近十年的国际设计期刊索引,都找不到它作为独立概念的明确定义。…

2026/10/19 14:43:16 阅读更多 →
基于MySQL的人脸识别考勤系统设计与关键实现

基于MySQL的人脸识别考勤系统设计与关键实现

1. 为什么要自己动手做一套人脸识别考勤系统 先说个真实的痛点。某小型团队之前用的是那种指纹打卡机,一到冬天干燥季节,手指脱皮、静电干扰,一堆人打不上卡;后来换成刷卡,又有人忘带卡、代刷,月底对考勤记…

2026/10/19 14:43:16 阅读更多 →

最新新闻

开源代码审查范式:Git+CLI+LLM协同的质量基础设施

开源代码审查范式:Git+CLI+LLM协同的质量基础设施

1. 这不是另一个“AI代码审查工具”,而是一套可审计、可验证、可嵌入工作流的开源协作范式你有没有遇到过这样的场景:团队里新来一位应届生,提交了PR,CI跑通了,测试也过了,但资深工程师扫了一眼就皱眉——变…

2026/10/19 15:23:06 阅读更多 →
PHP+MySQL实现百度地图打点全流程:地址解析、数据库存储与前端渲染

PHP+MySQL实现百度地图打点全流程:地址解析、数据库存储与前端渲染

简介:这是一份面向Web开发初学者与地理信息系统(GIS)入门者的PHPMySQLHTML百度地图打点实战示例,解决动态读取数据库坐标并在网页地图精准标注的核心问题,适用于LBS应用开发、课程设计及毕业项目快速原型搭建。压缩包共…

2026/10/19 15:23:06 阅读更多 →
open-code-review:基于CLI与LLM Agent的可追溯代码评审范式

open-code-review:基于CLI与LLM Agent的可追溯代码评审范式

1. 什么是 open-code-review:一个被严重低估的工程实践新范式“open-code-review”这个词最近在开发者社区里频繁出现,但它不是某个具体工具的名字,也不是某家公司的私有产品,而是一种正在快速成型的代码评审新范式——它把传统上…

2026/10/19 15:23:06 阅读更多 →
Git Diff+CLI+LLM Agent:可落地的开源代码审查新范式

Git Diff+CLI+LLM Agent:可落地的开源代码审查新范式

1. 这不是又一个“AI代码审查工具”,而是一套可落地的开源协作新范式最近两周,我在三个不同规模的团队里被问到同一个问题:“你们用的 open-code-review 是怎么跑起来的?为什么我们装了 codex cli 或 trae cli 总卡在 ‘unable to…

2026/10/19 15:23:06 阅读更多 →
Path of Building Build规划器上手:花钱前先在本地算清DPS、抗性与技能收益

Path of Building Build规划器上手:花钱前先在本地算清DPS、抗性与技能收益

Path of Building Build规划器上手:花钱前先在本地算清DPS、抗性与技能收益 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 交易网站上那件稀有武器标价不低&…

2026/10/19 15:22:02 阅读更多 →
SpringCloud Gateway 内存溢出排查:Direct Buffer Memory 泄漏与 Netty 堆外内存调优

SpringCloud Gateway 内存溢出排查:Direct Buffer Memory 泄漏与 Netty 堆外内存调优

1. 一次线上告警引发的排查:Gateway 内存溢出到底怎么回事那天晚上十一点多,监控群里突然弹出一连串告警,网关节点响应时间飙升,紧接着两个实例直接掉了。登录机器一看日志,满屏的java.lang.OutOfMemoryError: Direct …

2026/10/19 15:22:02 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →