1. 活动图不是流程图先厘清这张图到底在表达什么很多人第一次接触活动图会下意识把它当成流程图的另一种叫法。我见过不少项目里需求文档画的是活动图评审时大家讨论的却是这个审批节点该谁点结果图画得四不像既没有并发的语义也没有泳道的职责划分最后沦为一张谁都能改、谁都不认的草图。活动图的核心价值不在于把步骤连起来而在于它能表达并发、分支、汇合、职责归属这几件流程图天生说不清的事。换句话说流程图回答的是先做什么后做什么活动图回答的是谁在什么条件下同时做什么最后怎么收口。这个区别在实际项目里非常要命。举个我亲身经历的场景某跨平台系统的订单履约模块早期用普通流程图描述画出来是一条笔直的线——下单、扣库存、生成运单、通知仓库、发货。看着很清爽但上线后频繁出现库存扣了运单没生成的脏数据。回头复盘才发现扣库存和生成运单其实是两个可以并行、但必须同时成功或同时回滚的动作流程图根本表达不了这种并行汇合的约束评审时也就没人意识到这里需要事务控制。后来重画成活动图用分叉和汇合节点把两条并行流明确标出来问题一眼就暴露了。所以这篇内容我想聊的不是活动图怎么画这种教科书问题而是一个从业者在真实项目里怎么用好活动图它适合放在什么位置、哪些元素是必须画准的、哪些细节最容易被忽略、以及画完之后怎么拿它去跟开发和测试对齐。适合刚接触建模的新人也适合画了几年图但一直把它当流程图用的老手——后者往往更需要重新校准认知。1.1 活动图与流程图的三个本质分野要把活动图用对先得把这三个分野刻进脑子里。第一是并发语义。流程图里两条线并排画读者只能理解为这两件事都发生了但谁先谁后、是否同时、有没有互斥全靠猜。活动图的分叉节点fork和汇合节点join是有严格语义的从分叉出来的多条流是真正并行执行的汇合节点则要求所有入流都到达后才能继续。这个语义直接对应到代码里的多线程、异步任务、批量并行处理画准了开发一看就知道哪里要加锁、哪里要等齐。第二是职责归属。活动图的泳道swimlane不是装饰它把每个动作绑定到具体的执行者——可以是角色、系统、服务。我习惯在画图时先定泳道再填动作因为泳道一划很多这个步骤到底该谁做的扯皮当场就没了。流程图没有泳道的强制概念画出来经常是系统做了所有事评审时没人追问边界。第三是令牌流转。活动图的执行模型是令牌token在节点间流动一个动作节点消耗一个令牌、产出一个令牌分叉把一个令牌复制成多个汇合把多个合并成一个。这个模型听起来抽象但它是理解为什么汇合节点必须等齐的关键。我常跟新人说你把令牌想成一张必须被盖章的工单分叉就是复印几份同时去盖章汇合就是必须所有复印件都盖完章才能归档少一份都不行。维度流程图活动图并发表达并排线条语义模糊分叉/汇合节点语义严格职责归属无强制概念泳道绑定执行者执行模型步骤顺序令牌流转适用场景简单线性流程含并发、分支、多角色的复杂流程常见误用拿来表达并发当成流程图只画顺序1.2 什么场景该上活动图什么场景别硬套不是所有流程都值得画活动图。我的判断标准很简单只要流程里出现了同时或要么…要么…或多个角色接力就上活动图如果是一条直线走到底流程图甚至一段文字就够了。具体来说这几类场景活动图收益最高订单履约这类含并行子任务的业务流、审批流里含会签和或签的环节、数据处理管道里含分流和聚合的步骤、以及任何需要明确失败后走哪条补偿路径的流程。反过来纯展示型的页面跳转、单一角色的顺序操作、以及那种画出来只是为了贴文档凑数的流程硬套活动图只会增加维护成本——我见过一个只有三个步骤的登录流程被画成带泳道带分叉的活动图纯属过度设计。还有一个容易被忽略的点活动图在需求评审阶段的价值远大于在编码阶段。编码时大家看代码就行但评审时一张画准了并发和异常分支的活动图能让产品、开发、测试三方在同一个语义基础上讨论省掉大量我以为你说的是…的返工。2. 把活动图画准从泳道划分到异常分支的落地顺序画活动图最容易犯的错是上来就摆节点。我早期的习惯也是这样打开工具先拖几个圆角矩形边想边连画到一半发现泳道不对、分支漏了推倒重来。后来摸索出一套固定的落地顺序效率高很多也更不容易漏。这个顺序的核心逻辑是先定边界和角色再定主干最后补异常。因为边界决定了图的范围角色决定了泳道主干决定了正常路径异常分支则是最容易被忘、但对开发最有价值的部分。下面这套顺序是我在多个项目里反复用过的你可以直接照着走。2.1 第一步用起始和终止节点框定图的边界活动图必须有且仅有一个起始节点实心圆终止节点可以有一个或多个带圈的实心圆。这一步看着简单但边界定不准后面全乱。我的做法是先问自己一个问题这张图描述的是一次完整的业务闭环还是闭环中的某一段如果是前者起始节点对应触发事件比如用户提交订单终止节点对应所有可能的终态成功、失败、取消如果是后者就要在图的标题里明确标注范围避免读者误以为图外还有隐含步骤。多个终止节点是活动图相对流程图的一个优势——它允许你把成功结束和异常结束分开画而不是硬塞进一个终点。我习惯至少画两个终止节点一个正常完成一个异常终止这样读者一眼能看出流程有几种收场方式。如果异常路径有多种超时、校验失败、外部依赖不可用可以合并到一个异常终止节点但在连线上标注清楚触发条件。提示起始节点不要画成圆角矩形再写开始两个字那是流程图的习惯。活动图的起始节点是实心圆这是规范也是让图能被工具正确解析的前提。2.2 第二步泳道先划动作后填泳道划分是活动图里最考验业务理解的一步。我的原则是泳道对应执行者不对应模块或阶段。执行者可以是人角色、系统、外部服务。比如订单履约流程泳道可以是用户订单服务库存服务物流服务通知服务而不是下单阶段履约阶段——后者是阶段划分不是职责划分画出来动作归属还是糊的。划泳道时有个实操技巧先把流程里所有动作列成一张清单然后逐个问这个动作由谁执行把答案相同的归到一条泳道。如果某个动作找不到明确的执行者说明要么它是纯人工的隐性步骤该补一个角色泳道要么它其实不该出现在这张图里属于别的流程。我见过泳道里出现系统一条大泳道包揽所有动作的图那基本等于没划泳道并发和职责全丢了。泳道数量也要控制。超过六条泳道的活动图横向阅读会非常累这时候要考虑拆图——按子流程拆成多张用子活动节点带小叉的圆角矩形引用。拆图的判断标准是如果两条泳道之间的交互只有一两次且交互点很清晰就可以把其中一条泳道的内容抽成子活动图。2.3 第三步主干路径用动作节点串起来每个动作必须是动词宾语主干路径就是正常情况下的执行顺序。这一步的坑在于动作节点的命名。我见过太多图里写着处理校验确认这种光杆动词读者根本不知道处理什么、校验什么。规范的做法是动词宾语比如校验库存余量生成运单号发送发货通知。这样命名还有个好处它天然对应一个函数或一个接口开发和测试可以直接拿节点名去对代码和用例。动作节点之间用带箭头的实线连接表示控制流。这里要注意活动图里的连线默认是上一个动作完成后才走下一个如果你需要表达某个动作完成后同时触发多条流就必须用分叉节点不能简单地从动作节点拉出多条线——后者在严格语义下是模糊的工具解析时可能报错人工阅读时也容易误解。主干路径画完后我习惯做一次读图测试从起始节点开始沿着主干一路读下来每个动作节点读成一句谁做了什么如果读起来通顺、没有跳跃说明主干是完整的如果读到某处卡壳说明漏了动作或泳道归属错了。2.4 第四步补分支、分叉、汇合把同时和要么画出来这是活动图区别于流程图的核心步骤也是最容易画错的地方。分支decision用菱形表示一个入流、多个出流每个出流上标注守卫条件guard condition比如[库存充足][库存不足]。守卫条件必须互斥且完备——互斥是指不能有两个条件同时成立完备是指所有可能情况都被覆盖。我见过只画了[库存充足]和[库存不足]却漏了[库存查询超时]的图结果开发按图实现超时情况直接抛异常没人处理。补守卫条件时我习惯把异常和超时单独列出来因为它们最容易被当成不会发生而漏掉。分叉fork和汇合join用粗横线表示分叉一入多出汇合多入一出。分叉出来的多条流是并行的汇合要求所有入流都到达。这里有个高频错误把分叉和分支混用。分支是选一条走分叉是全都走语义完全不同。比如扣库存和生成运单如果是并行执行的就用分叉如果是先扣库存扣成功才生成运单那就是顺序加分支不是分叉。画错这个开发可能把本该串行的逻辑写成并行引发数据竞争。汇合节点还有个细节如果并行流中有任何一条可能不到达比如某条流中途异常终止汇合就会永远等下去形成死锁。所以画汇合时要想清楚所有入流是否都保证会到达如果某条流可能提前终止要么在终止前先汇合要么改用其他结构。这个点在评审时经常被忽略但它是并发 bug 的常见来源。2.5 第五步异常路径和补偿动作单独成线正常路径画完很多人就收工了。但活动图对开发最大的价值恰恰在异常路径。我的做法是每个可能失败的动作节点都问一句失败了怎么办把补偿动作画出来。比如扣库存失败补偿是释放已锁定的库存生成运单失败补偿是回滚库存扣减。这些补偿动作往往跨泳道正好用活动图的泳道表达清楚谁来补偿。异常路径的连线我习惯用虚线或不同颜色区分视觉上和主干分开读者一眼能看出哪些是正常流、哪些是异常流。如果异常路径太多导致图太乱可以把异常处理抽成独立的子活动图主图上用子活动节点引用标注异常处理见子图X。常见画错点错误表现正确做法分叉与分支混用用菱形表达并行并行用粗横线分叉守卫条件不完备只画正常和失败两种补超时、异常等边界条件汇合死锁并行流可能提前终止仍汇合终止前先汇合或改结构动作命名含糊处理校验动词宾语对应接口泳道按阶段划分下单阶段履约阶段按执行者划分3. 那些评审时没人提、上线后才爆的细节画图这件事规范文档里写的都是应该怎样但真正让人栽跟头的往往是规范没写、评审也没人提的细节。我在几个项目里踩过一些坑事后回想如果画图时多问一句就能避免。这一节挑几个最有代表性的说说都是那种画的时候觉得无所谓、出问题才发现要命的点。3.1 汇合节点等不齐并行流的隐形提前终止前面提过汇合死锁这里展开说一个更隐蔽的变体。某次做批量对账系统活动图里画了一个分叉一条流去拉取交易明细一条流去拉取银行流水然后汇合后做比对。图看着没问题但上线后偶尔出现对账任务卡死。排查发现拉取银行流水那条流在无流水时会走一个分支直接到终止节点根本没经过汇合——也就是说这条流提前终止了而汇合节点还在等它永远等不到。这个问题的根因是画图时把无数据当成了正常结束却没意识到它破坏了汇合的等齐语义。修复方案有两种一是让无流水分支也先经过汇合再终止把空结果当成一种正常输入传给比对环节二是把汇合改成或汇合语义但标准活动图没有或汇合需要改用其他结构表达。我们最终选了第一种因为比对环节本来就应该处理空输入让空结果走完整路径反而更健壮。这个坑的教训是画分叉时要沿着每条并行流一直走到终止确认它们都会经过汇合节点。任何一条流有提前下车的可能汇合就有死锁风险。评审时如果没人问这个就自己主动走一遍每条流。3.2 守卫条件的隐含假设你以为的互斥其实不互斥守卫条件要求互斥但实际画的时候很多条件之间存在隐含的重叠。比如库存充足和库存不足看着互斥但如果库存查询本身返回了错误码这两个条件都不成立流程就悬空了。再比如金额大于100和金额小于等于100看着完备但如果金额是负数退款场景两个条件都不覆盖。我的做法是每画一组守卫条件就列一张边界值表把等于、小于、大于、异常、空值都过一遍。这张表不用画进图里但画图时心里要有。如果发现某个边界没被覆盖要么补一个分支要么在图上标注其他情况走异常终止。这个习惯帮我拦下过好几次金额为0时流程卡住的低级问题。还有一种情况是条件之间有依赖。比如[用户是VIP]且[订单金额大于500]和[用户是VIP]且[订单金额小于等于500]这两个条件看着互斥但如果第一个条件里的VIP判断和第二个条件里的VIP判断来自不同数据源一个来自缓存、一个来自数据库就可能出现两个都成立或都不成立的情况。这种跨数据源的条件我建议在图上标注数据来源或者干脆拆成两级分支先判VIP再判金额避免复合条件带来的歧义。3.3 泳道交叉太多图在说话但没人听得懂泳道交叉是活动图可读性的头号杀手。当两条泳道之间的连线来回穿梭超过三四次图就开始打结读者要顺着线找半天才能理清顺序。我见过一张七条泳道、连线交叉二十多次的活动图评审时大家看了五分钟就开始走神最后结论是图太复杂还是口头说吧——那这张图就白画了。减少交叉的实操方法有几个。一是调整泳道顺序把交互最频繁的泳道放在相邻位置交叉自然减少。二是把跨泳道的连续交互抽成子活动比如订单服务和库存服务之间来回五六次就把这段抽成一张子图主图上只留一个子活动节点。三是用消息流替代部分控制流如果两个泳道之间只是通知关系而非等待完成关系可以用虚线箭头表示异步消息不必画成实线控制流视觉上会清爽很多。注意泳道顺序调整后要重新检查所有连线的语义有没有变。有时候调整顺序会让原本清晰的先A后B变得模糊这时候宁可不调改用子活动拆分。3.4 动作粒度失控一张图里既有点击按钮又有完成履约动作粒度不统一是另一个高频问题。同一张图里有的节点细到点击提交按钮有的节点粗到完成订单履约读者根本没法判断哪些是同一层级的事。粒度失控的根源是画图时没想清楚这张图给谁看。我的经验是活动图的动作粒度应该对齐一个可独立测试的业务动作。给产品看粒度可以粗到提交订单给开发看粒度细到校验参数写订单表发消息给测试看粒度对齐测试用例的步骤。同一张图里不要混用不同粒度如果确实需要展示不同层级用子活动节点做分层——主图粗粒度子图细粒度。判断粒度是否合适有个简单的自检每个动作节点能不能对应到一个明确的输入和输出如果某个节点说不清输入是什么、输出是什么要么它太粗该拆要么它太细该合并到相邻节点。4. 从图到代码再到用例活动图怎么真正落地画得再漂亮的活动图如果只躺在文档里没人用价值就是零。我见过太多团队把活动图画完就归档开发和测试各干各的图成了摆设。真正让活动图产生价值的是把它当成开发实现和测试设计的共同基准——开发照着它写并发和异常处理测试照着它设计用例覆盖分支和并行路径。这一节聊聊怎么把图用起来。4.1 活动图到代码结构的映射关系活动图的元素和代码结构之间有比较直接的对应关系理清这层映射开发看图就能落代码。动作节点对应一个函数或方法节点名就是函数名动词宾语正好符合命名规范。分支节点对应 if-else 或 switch守卫条件就是判断条件。分叉节点对应并发执行——可以是多线程、异步任务、批量并行具体选哪种看场景汇合节点对应等待所有并发任务完成比如 Promise.all、CountDownLatch、或者批量任务的 join。泳道对应模块或服务边界跨泳道的连线对应服务间调用或接口调用。我习惯在活动图旁边附一张映射表把关键节点和对应的代码位置标出来。这样评审时开发能直接说这个分叉我打算用线程池实现测试能直接说这个汇合点我要测所有流都到达和某条流超时两种情况讨论就落到了实处。活动图元素代码对应测试关注点动作节点函数/方法输入输出、边界值分支节点if-else/switch每个守卫条件各一条用例分叉节点并发任务启动并发正确性、资源竞争汇合节点等待所有任务完成全部到达、部分超时、部分失败泳道模块/服务跨服务调用的契约异常终止异常处理/回滚补偿动作是否执行4.2 用活动图反推测试用例分支覆盖加路径覆盖测试用例设计最怕漏场景而活动图恰好是补漏的好工具。我的做法分两步先做分支覆盖再做路径覆盖。分支覆盖就是每个分支节点的每条出流至少走一次。把图上所有菱形节点的出流列出来每条出流对应一个用例确保守卫条件的每个分支都被测到。这一步能拦住大部分某个条件分支从没被执行过的问题。路径覆盖更狠一点要把分叉和汇合的组合也考虑进去。一个分叉有两条并行流理论上就有都成功一条成功一条失败都失败一条超时等多种组合每种组合对应一条路径。全部组合可能爆炸所以实际做的时候按风险挑高风险路径涉及资金、库存、外部依赖全组合覆盖低风险路径做代表性覆盖。我还会专门为汇合节点设计用例所有流都到达、某条流延迟到达、某条流提前终止、某条流抛异常。这四个场景基本能覆盖汇合相关的并发问题。前面说的对账系统卡死就是某条流提前终止这个用例没设计到。4.3 活动图作为跨角色沟通的单一事实源最后说一个偏协作的点。活动图最大的隐性价值是它能成为产品、开发、测试之间的单一事实源。需求文档的文字可以有歧义口头讨论可以各说各话但一张画准了并发、分支、泳道、异常的活动图三方看到的是同一个东西。要让这个价值落地关键是图要跟着变更走。我见过图在评审后就被丢在一边需求变更了图不改结果图成了历史文档没人再信它。我的做法是把活动图纳入变更流程任何涉及流程的变更先改图再改代码图改完重新评审一次。这样图始终是最新的大家也就愿意看它。还有个技巧在图上给关键节点编号需求文档、代码注释、测试用例都引用这个编号。比如节点 A3 对应库存扣减接口这样三方对齐时直接说编号不用描述半天就是那个扣库存的步骤。编号不用很正式手写在图上或者用工具的节点 ID 都行关键是三方用同一套。5. 工具选型与维护别让图变成一次性消耗品活动图画得好不好工具占一部分因素但更关键的是维护习惯。我见过用专业建模工具画得规规矩矩但半年不更新的图也见过用最朴素的绘图工具画得潦草但每周同步的图——后者的实际价值高得多。这一节聊聊工具怎么选、图怎么维护都是些踩过坑之后的实在经验。5.1 建模工具与通用绘图工具的分界工具大致分两类一类是专业建模工具支持活动图的标准语义分叉汇合节点、令牌流转、子活动引用导出的图能被其他建模工具解析另一类是通用绘图工具什么图都能画但活动图的语义靠人工保证。选哪类取决于这张图的生命周期和协作范围。如果图要长期维护、多人协作、还要和代码或其他模型关联专业建模工具更合适因为它的语义严格改起来不容易改错。如果图只是评审时用一下、之后以文档形式存档通用绘图工具更快更灵活没必要上重装备。我个人的折中方案是核心业务流程用专业建模工具辅助说明用通用绘图工具。核心流程变更频繁、参与方多值得投入学习成本辅助图生命周期短快速画完快速用不折腾。不管用哪类工具有几个功能是必须的泳道支持、分叉汇合节点、连线上的条件标注、节点编号。缺了这几个画活动图会很别扭画出来也不规范。5.2 版本管理图也要能 diff图不像代码改一个节点可能牵动十几条连线版本管理一直是个痛点。我的做法是图和文档同仓管理用文本格式存图很多建模工具支持导出为文本描述这样每次变更都能 diff能看出改了哪个节点、加了哪条连线。如果工具只支持二进制格式那就退而求其次每次大改存一个版本快照文件名带日期和变更摘要。比版本管理更重要的是变更记录。我在图的角落或者图下方的说明区维护一个简单的变更表日期、改了什么、为什么改、谁改的。这个表不用很正式几行字就行但它是图可信度的来源——读者看到图能知道它是什么时候的、改过几次、当前是不是最新。5.3 图的生命周期什么时候该归档什么时候该重画活动图不是画完就一劳永逸的。业务变了、系统拆了、角色调整了图就得跟着变。我的判断标准是当图上的动作节点有超过三成和现实不符时重画比修补划算。修补一张过时的图往往要改连线、调泳道、补分支改完还不如重画一张干净。归档也有讲究。过时的图不要直接删标注已归档见新图X后保留因为历史图在追溯当初为什么这么设计时还有价值。我习惯在归档图上加一条醒目的横线或水印避免有人误用旧图。最后分享一个我坚持了很多年的小习惯每张活动图画完后自己当一次最挑剔的读者从起始节点走到每个终止节点每条路径都走一遍每个守卫条件都问一句还有没有别的情况。这个自检花不了十分钟但能拦下大部分低级错误。图画得准不准最终不取决于工具多专业而取决于画图的人愿不愿意多走那几遍路径。
企业数字化 ERP 产品动态
相关推荐
Maven多环境构建动态启用Spring Boot Profiles实战指南 多环境配置这件事,几乎每个用 Spring Boot 做项目的团队都会撞上。最早大家都是把所有配置往一个 application.yml 里塞,本地开发、测试环境、预发、生产全混在一起,改一行配置心惊胆战,提交代码前还得反复确认有没有把本地数据… · 2026/11/3 11:40:20
UG NX 10.0二次开发:图层分类标签获取技术详解 1. UG NX 10.0二次开发中的图层分类标签获取技术解析 在机械设计领域,UG NX(原Unigraphics)作为主流的三维CAD/CAM/CAE软件,其二次开发能力为工程师提供了强大的定制化工具。今天要深入探讨的是UG NX 10.0二次开发中一个关键API函… · 2026/11/3 11:40:20
RabbitMQ路由模式与死信队列实战解析 1. 项目概述:RabbitMQ路由模式与死信队列的黄金组合 RabbitMQ作为企业级消息中间件的代表,其路由模式和死信队列的组合堪称分布式系统中的"保险丝导航仪"机制。我在电商秒杀系统的实战中发现,这种组合能同时解决消息精准投递和异常… · 2026/11/3 11:39:19
大学生论文写作模型选型指南:避坑策略与WorkBuddy配置方案 大学生论文写作的模型选型,我踩过的坑和最终方案 每到论文季,后台总有人问我同一个问题:用 WorkBuddy 这类写作辅助工具写课程论文、学术文章,到底该挂哪个模型?问的人多了,我发现大家真正纠结的不是"… · 2026/11/3 14:44:47
云原生监控实战:Prometheus+Grafana高效部署与优化 1. 项目概述:云原生监控的黄金搭档 在容器化和微服务架构盛行的今天,传统的监控手段已经难以应对动态变化的云原生环境。这正是PrometheusGrafana组合大显身手的场景——前者负责多维度指标采集,后者专注可视化呈现,两者结合形成了… · 2026/11/3 14:44:47
Hindsight实战:用Python解析Firefox历史记录并生成可视化报告 1. 项目概述:"hindsight"到底在解决什么问题 如果你在技术社区搜索 hindsight 这个词,大概率会碰到两条线索:一条是 Google 的强化学习团队提出的 Hindsight Experience Replay,解决稀疏奖励问题;另一条是 M… · 2026/11/3 14:44:47
Redis缓存击穿解决方案与Redisson分布式锁实践 1. 项目背景与问题定义在微服务架构中,缓存是提升系统性能的关键组件。Redis作为主流的内存数据库,常被用作缓存中间件。但实际应用中,缓存击穿问题就像一把悬在头顶的达摩克利斯之剑——当热点key过期瞬间遭遇高并发请求,数据库可… · 2026/11/3 14:44:47
FUXA开源组态软件:工业自动化SCADA与HMI开发指南 1. FUXA组态软件概述FUXA是一款基于Web的开源组态软件,主要用于工业自动化领域的SCADA(监控与数据采集)、HMI(人机界面)和可视化看板开发。作为一款轻量级解决方案,它允许工程师快速构建现代化的工业数据可… · 2026/11/3 14:44:47
后见之明偏差如何毁掉复盘?用时间线与决策记录破解 “hindsight is 20/20”,这句英文俗语我读第一遍的时候只觉得是在说“事后看一切清楚”。后来干了十几年研发,参与过几十场大大小小的复盘会,才真正理解“事后”这两个字的杀伤力。每当线上事故复盘,总有人拍桌子说“这个配置错误… · 2026/11/3 14:43:44
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46