首页/新闻资讯/正文详情

BLUEM2源码:六进程MMORPG服务端编译、启动与二次开发

发布时间:2026/11/2 20:07:33 来源:云帆数科 栏目:资讯中心
BLUEM2源码:六进程MMORPG服务端编译、启动与二次开发
简介BLUEM2源码.rar 面向希望研究 BLUEM2 项目实现、进行 Delphi 工程复现与二次开发的开发者包内为 2018 年 9 月 18 日版本的源码快照可用于梳理项目模块划分、窗体与资源组织以及多子项目编译关系。压缩包共 19426 个文件、约 680.28MB以 pas 源文件、dcu 编译单元、res 资源、dfm 窗体、dpr/dproj/dpk 工程与包文件为主并含 bmp、dof、rc、cpp、htm 等配套素材和说明能够较完整地呈现工程结构、依赖关系与构建线索。已有 1292 人学习适合具备一定 Pascal/Delphi 基础、需要对照工程文件理解模块调用、资源加载和编译流程的读者也可作为整理旧版工程、排查构建问题和开展二次开发时的参考底稿。1. 拿到 BLUEM2 源码先别急着编译它是一整套服务端前阵子有人把一份 BLUEM2 源码.rar 丢过来说服务端能起来、客户端连不上让我看看。我解压完第一反应是这活儿一个人几天啃不完。BLUEM2 源码不是某个小工具它是一整套 2D 俯视角 MMORPG 的服务端引擎——登录网关、选角网关、游戏网关、主逻辑服、数据服、日志服六个可执行程序各自独立编译、独立启动靠一套自定义协议串成一条链。主逻辑是 Object Pascal 写的Delphi 编译脚本用纯文本外挂人物和怪物数据落在本地 DB 文件里属于那种“代码老、但结构极其完整”的工程。适合三类人想搞明白老派服务端怎么分层的人、要在现成引擎上加功能的人、接手了这套东西必须维护的人。读完你至少能做到自己把六个程序编译出来、按顺序跑通、并且知道改一个 GM 命令该动哪个单元。2. 源码目录拆解六个进程各自管什么解压出来第一层目录如果不看一眼就打开 M2Server 工程编译大概率半小时后卡在缺单元报错上。先把目录分工认清楚比什么都重要。2.1 第一层目录源码、公共单元、运行时资源要分开看不同分支的目录名会有点出入但结构大同小异常见的是这样目录内容性质M2Server主逻辑服工程地图、怪物、技能、脚本引擎、人物对象都在这源码LoginSrv账号服务负责校验账号、返回区列表源码DBServer角色数据服负责读写人物、物品、行会等数据源码LogServer日志服各进程把日志往这里丢源码LoginGate / SelGate / RunGate三个网关分别对登录、选角、游戏内消息做转发源码Share公共单元协议常量、编解码、字符串工具、基础对象源码先读这里Envir运行时资源地图、怪物刷新、NPC 脚本、掉落配置数据不是代码Tools配套小工具数据库编辑、脚本检查之类工具分清这张表的意义在于改逻辑去上面六个工程改玩法数值去 Envir改协议常量去 Share。我见过有人在主逻辑单元里硬编码怪物刷新坐标其实 Envir 下一个刷新配置文件就能改为什么要动代码是因为没分清代码和数据的边界。提示Share 目录是理解整套引擎的入口。协议号、消息结构、编解码函数全在里面看不懂 Share其他六个工程都是黑匣子。2.2 六个进程的职责边界与启动顺序这套架构是典型的“网关前置 主逻辑集中”的老派设计所有客户端连接先进网关网关只做转发和初步校验不做业务判断真正的业务全部压在 M2Server 一个进程里。好处是逻辑集中、状态好维护坏处是 M2Server 一挂全服下线。职责和常见默认端口具体以!Setup.txt为准下面只是常见值程序职责谁连它常见端口LoginGate接收客户端登录请求转发给 LoginSrv客户端7000LoginSrv校验账号、返回可选区列表LoginGate5500SelGate角色列表、创建角色、选角进入客户端7100RunGate游戏内所有消息的转发通道客户端7200M2Server地图、怪物、技能、脚本、战斗结算RunGate5000DBServer角色数据落盘与读出M2Server、LoginSrv6000LogServer日志收集全部1000启动顺序不是随便排的得按依赖从下往上LogServer → DBServer → LoginSrv → M2Server → 三个网关。反过来启动的话M2Server 起来后连不上 DBServer会在控制台刷一串连接失败然后地图加载流程直接中断。这个顺序错了很多人第一反应是“源码有问题”其实是自己启动顺序搞反了。2.3 Delphi 工程组与公共单元为什么一打开就缺单元这套源码的工程文件是.dpr 一堆.pas主工程里uses了 Share 下的公共单元还有一些第三方组件包界面控件、表格控件、加密库之类。所以直接双击.dpr打开十有八九第一屏就是“找不到 xxx.dcu”。原因很单纯Delphi 编译时按 Library Path 找单元公共单元和第三方包没有输出.dcu到默认搜索路径编译器就找不到。处理方法两步先把 Share 目录加进工程搜索路径Project → Options → Directories/Conditionals → Search path再把依赖的组件包先编译安装一遍。这类老工程最忌讳的就是“缺什么就注释掉什么”——你注释掉的那个单元里往往有初始化代码编过了运行期一样崩。另外Share 里最该先读的是协议常量单元一般叫Grobal2.pas这类名字。里面是一大段CM_xxx 100的常量定义客户端的每一个动作、服务端每一个回包都对着这里的一个数字。把这张常量表当成索引顺着消息号去搜主逻辑里的case分支比从头读代码快十倍。3. 把引擎跑起来编译环境、配置与数据到这一步目录已经认完了接下来是实打实的环境问题。这套代码对编译器的要求比较“复古”硬上最新版本会后悔。3.1 编译器与组件库为什么建议锁在 Delphi 7源码主体是 ANSI 时代的写法字符串用string当AnsiString用指针到处是PChar调用 Win32 API 时直接传PChar。Delphi 2009 之后默认string变成 UnicodePChar变成PWideChar同一份代码编译出来就是满屏类型不兼容。所以最省事的方案是锁 Delphi 732 位编译不要试图升级。要准备的东西大致三类Delphi 7 本体装完确认dcc32.exe在命令行里能直接调用公共组件库源码里uses了哪些就装哪些装完把包里的 source 路径加进 Library Path一个能编辑 ANSI 编码文本的编辑器用来改 Envir 下的脚本和配置别用默认存 UTF-8 的新编辑器。注意装第三方包时同一套库只保留一个版本。两个版本共存会让编译器随机挑到旧的.dcu报出来的错和实际代码完全对不上这种问题排查起来非常费时间。3.2 编译顺序写成一个批处理别手点六个工程一个个手点编译太慢而且容易漏。用dcc32写个批处理按依赖顺序过一遍出问题也能定位到具体是哪一步。# 环境变量里先保证 dcc32 可用 # -B 强制全部重编译-U 追加单元搜索路径Share 公共单元在这 DCCdcc32 -B -U\Share;Share\Common\ # 1. 先编公共单元产出 dcu 给后面用 $DCC Share\HUtil32.pas $DCC Share\Grobal2.pas $DCC Share\EDcode.pas # 2. 再编无业务依赖的服务 $DCC LogServer\LogServer.dpr $DCC DBServer\DBServer.dpr # 3. 编有依赖的主逻辑与登录 $DCC LoginSrv\LoginSrv.dpr $DCC M2Server\M2Server.dpr # 4. 最后编三个网关 $DCC LoginGate\LoginGate.dpr $DCC SelGate\SelGate.dpr $DCC RunGate\RunGate.dpr-B是强制重编第一次必须加否则链接进来的可能是别人机器上编出来的旧.dcu-U追加单元搜索路径Share 目录必须包含不然第 1 步之后的每个工程都会报找不到单元。批处理跑完看退出码0才算过非0就往上翻第一个Error别去看后面的连带报错那些多半是第一个错误的余波。3.3 !Setup.txt端口、地址、路径三件事配置文件名一般带感叹号放在 M2Server 目录下格式是老式 ini。真正需要动的字段没几个剩下的默认值别乱改。[Server] ; 服务器对外地址。单机测试填 127.0.0.1局域网联机必须填本机内网 IP ServerAddr192.168.1.20 ; 主逻辑服监听端口网关要连这个 ServerPort5000 ; 数据服地址M2Server 启动时会去连 DBServerAddr127.0.0.1 DBServerPort6000 ; 日志服 LogServerAddr127.0.0.1 LogServerPort1000 [Setup] ; 地图、怪物、NPC 脚本所在的资源目录相对路径以 M2Server 所在目录为基准 EnvirPath.\Envir ; 人物数据文件所在目录 DBPath.\DB ; 是否开启脚本调试日志调脚本时打开上线关掉 ScriptDebug1三个地方最容易翻车ServerAddr填了127.0.0.1却让另一台机器的客户端连那客户端永远卡在验证EnvirPath用了绝对路径换台机器就找不到ScriptDebug一直开着日志文件涨得飞快把磁盘塞满。这三个我都真实遇到过后面避坑章里会再展开。3.4 数据库与 Envir 资源先确认数据能读出来角色数据一般落在 DB 文件里通过 BDE 数据引擎走别名访问别名在控制面板里配置指向 DB 文件所在目录。这一步没配好DBServer 启动时不会立刻报错而是等到有客户端登录那一刻才抛异常——排查时很容易误判成“登录逻辑有问题”。判断方法很直接DBServer 启动后控制台会打印加载了哪几个表、各多少条记录。看到记录数是 0 就不对正常应该有几万条怪物、物品和至少一条测试账号。BDE 别名配错时通常表现为“表能打开但字段全空”因为指向了一个空的同名文件。Envir 目录则是另一套东西地图文件、地图连接信息、怪物刷新点、NPC 脚本、掉落配置全是文本或二进制资源。M2Server 启动时会把整个 Envir 扫一遍加载失败会在控制台打印文件名和行号。养成习惯M2Server 启动后第一件事是翻控制台日志确认没有load fail。4. 核心链路拆解一个登录请求走到哪里去了前面都是准备工作这一章是真正值得读的部分。我们顺着一条客户端消息从网关进、到主逻辑出看它经过哪些代码。4.1 网关的接收与转发定长头 裸字节转三个网关的代码高度相似都是“收字节流 → 判断消息类别 → 转发”。核心是一个定长消息头里面有识别码、消息号、参数、序号几个字段所有协议包都以它开头。转发逻辑大致长这样// RunGate收到客户端一个完整包后按消息号决定往哪边转 procedure TGateServer.ProcessClientMsg(Sender: TUserSession; Buf: PChar; Len: Integer); var MsgHeader: TDefaultMessage; begin // 短包直接丢。不判长度就 Move越界读内存崩了都不知道为什么 if Len SizeOf(TDefaultMessage) then Exit; Move(Buf^, MsgHeader, SizeOf(TDefaultMessage)); case MsgHeader.Ident of CM_LOGIN: FLoginSrvSocket.SendText(Buf, Len); // 登录类转 LoginSrv CM_SELECT: FSelGateSocket.SendText(Buf, Len); // 选角类转 SelGate else // 其余全部转主逻辑服。主服没连上就断开客户端别让它干等 if FMainSocket.Connected then FMainSocket.SendText(Buf, Len) else Sender.CloseSocket; end; end;TDefaultMessage是定长结构SizeOf判断是唯一的安全防线任何自己写的网关都别省这一步。SendText是原样转发网关不解包、不改包这是这套架构最重要的约定——一旦有人在网关里开始改业务数据主逻辑和网关的状态就会不一致出问题很难定位到是哪一层改坏的。客户端断线清理走TUserSession的释放流程CloseSocket之后记得把会话从列表里摘掉否则用户列表会越积越长。4.2 6bit 编解码与消息分发抓包看到乱码是正常的这套协议里有个反直觉的点字符串字段不是明文也不是标准二进制而是一种 6bit 编码。它把每 6 位打包成可打印字符目的是绕开早期网络设备对特殊字节的过滤。所以拿工具抓包看正文部分是一串看似乱码的可见字符直接当字符串读永远是错的。主逻辑侧的处理顺序是先解 6bit再按消息号分发。// M2Server一个玩家对象处理客户端消息 procedure TPlayObject.ProcessClientMsg(const Msg: TDefaultMessage; const Body: string); var S: string; nLen: Integer; begin nLen : Length(Body); S : Decode6BitBuf(Body, nLen); // 还原nLen 会被改写成真实有效长度 case Msg.Ident of CM_QUERYUSERNAME: QueryUserName(Msg.Recog, S); CM_SAY: ProcessSayMsg(S); // 聊天可能命中 [标签] 脚本 CM_ACTION: ProcessAction(Msg.Recog, Msg.Param, Msg.Tag, Msg.Series); else // 未知消息号只记日志绝不抛异常。一个坏包不能让整张地图停摆 g_LogServer.AddLog(unknown ident IntToStr(Msg.Ident)); end; end;参数说明Msg.Recog是客户端给的识别码回包时要原样带回去客户端靠它匹配请求Msg.Param / Tag / Series是三个通用整型参数不同消息号含义不同具体看 Share 里的常量表和注释Body是变长部分长度由包头给出。Decode6BitBuf第二个参数是 var 引用因为 6bit 编码可能带填充字节解出来的真实长度要往回传。这里有个工程习惯值得学else分支不抛异常只记日志。服务端要 24 小时跑任何一个畸形包都不能让进程退出这个防御思维贯穿整套代码。4.3 玩家对象与地图环境生命周期挂在哪里玩家进游戏的过程是选角网关通知主逻辑 → 主逻辑创建TPlayObject实例 → 挂到目标地图的TEnvirnoment上 → 进入主循环。玩家对象里存着坐标、血量、背包、技能、行会等全部状态地图对象里存着这张图上的所有角色和怪物。主循环的常见做法是单线程轮询每个地图对象有自己的处理节拍按固定间隔驱动怪物 AI、 buff 计时、地图事件玩家消息则在收包时直接处理。这套模型简单可靠缺点是单张地图怪物太多时会拖慢整帧。所以二次开发时想加复杂度高的玩法比如大范围寻路、复杂弹道第一原则是别在主循环里做重活能丢到定时器或者异步队列里就丢出去。对象释放是另一个容易出问题的地方。玩家下线时如果只是从地图上摘掉但没Free内存会缓慢泄漏反过来如果Free了但地图的角色列表没清理下次遍历会访问到野指针表现是随机崩服。这两处必须成对处理我在源码里看到过用引用计数兜底的做法值得借鉴。4.4 脚本引擎QFunction-0.txt 是怎么被执行的玩法的绝大部分不写死在代码里而在脚本里。主脚本文件通常叫QFunction-0.txt格式是分段标签 条件 动作; 玩家在游戏里输入 帮助 时命中这段 [帮助] #IF CHECKLEVEL 1 #ACT SENDMSG 5 欢迎输入 回城 可以返回主城 ; 没有 #IF 段表示无条件执行#SAY 段是给 NPC 对话框用的文本 [回城] #ACT MAPMOVE 0 330 330引擎启动时把这个文件整个读进内存按[标签]切成一段段过程存到哈希表里。玩家触发时先查表命中就逐行解释执行#IF段里的条件逐条判断全真才走#ACT。SENDMSG的第一个参数是消息类型决定客户端弹在哪个位置MAPMOVE后面三个参数是地图号加坐标。提示脚本文件必须用 ANSI 保存。存成 UTF-8 带 BOM 时第一行的[标签]前面会多出三个不可见字节导致标签永远匹配不上现象是“脚本明明写了但就是不触发”。脚本引擎的性能瓶颈在条件判断一条#IF里堆十几个条件每次触发都要全跑一遍。高频触发的标签比如每次攻击、每次走路的回调条件要尽量少能用代码里算好的标志位判断就别在脚本里重复算。5. 避坑记录编译、启动、连接三段的失败清单这一章全是踩过的坑按“现象 → 原因 → 解决”写遇到对得上的直接照方抓药。5.1 编译期缺单元与类型不兼容现象一一打开工程就报File not found: xxx.dcu报错单元来自 Share 或第三方包。原因公共单元没加进搜索路径或者依赖的组件包没编译安装编译器在 Library Path 里找不到。 解决先把 Share 目录加进 Project Options 的 Search path再按 3.2 的顺序把公共单元单独编一遍产出.dcu第三方包先从包工程里 Build 再 Install。别用“注释掉 uses”这种方式绕过。现象二换高版本 Delphi 后满屏E2010 Incompatible types: PAnsiChar and PWideChar。原因源码是 ANSI 时代写的string当AnsiString用PChar直接传给 Win32 API。2009 之后默认字符串变 Unicode全部类型对不上。 解决老实待在 Delphi 7。真要用新版本就得逐个把对外 API 的PChar改成PAnsiChar、string改成AnsiString工作量按几千处算而且改完运行期还会有一堆隐式转换的隐藏 bug。5.2 启动期进程起来了但没真正就绪现象三M2Server 启动后控制台刷一串连接失败地图加载到一半停住。原因启动顺序反了DBServer 还没起就去连或者 DBServer 起了但 BDE 别名指向错误目录表打不开。 解决严格按 LogServer → DBServer → LoginSrv → M2Server → 三网关的顺序起。DBServer 起来后先看它打印的表记录数是 0 就说明别名指错了去控制面板改别名路径再重启。现象四改了脚本重启后不生效或者脚本里中文全是问号。原因QFunction-0.txt被存成了 UTF-8标签前面多了 BOM或者改了文件但没重启 M2Server脚本只在启动时加载一次。 解决用编辑器另存为 ANSI确认首行就是[标签]没有任何前缀字符改完脚本重启 M2Server或者用引擎自带的脚本重载命令。5.3 连接期客户端卡在某个环节现象五客户端一直卡在“正在验证账号”网关日志里能看到连接进来但没后续。原因!Setup.txt里的ServerAddr还是127.0.0.1而客户端在另一台机器上或者本机防火墙拦了 7000/7100/7200 三个端口。 解决ServerAddr改成本机内网 IP防火墙对三个网关端口和主逻辑端口放行。排查时先在服务器本机用客户端连127.0.0.1试一次能进就说明是网络或地址配置问题不是源码问题。6. 二次开发加一条 GM 命令要动哪几个地方拿“加一条查坐标命令”当例子这是最典型的改造路径走通一遍加其他功能就是换个函数体的事。改动点分布在三个层次层次文件位置改什么命令入口主逻辑里的聊天/命令处理单元在命令分发处加一个分支权限判断角色属性里的 GM 等级字段先判等级再执行顺序不能反提示文案消息号常量 客户端消息表新增消息号要在 Share 里同步定义保底处理Envir\QFunction-0.txt代码里没匹配到的命令交回脚本引擎代码层大概是这样// M2Server处理玩家输入的 命令返回 False 表示交给脚本引擎 function TPlayObject.ProcessCommand(const Cmd, Args: string): Boolean; begin Result : True; if CompareText(Cmd, 查坐标) 0 then begin // 权限判断放最前面。放后面等于给所有人开了后门 if not IsGmMode then begin SendMsg(你没有权限); Exit; end; SendMsg(Format(地图 %s 坐标 %d:%d, [FEnvirnoment.sMapName, CurX, CurY])); end else Result : False; // 不认识的命令交回脚本引擎按 [标签] 匹配 end;CompareText不区分大小写比稳IsGmMode是权限位判断必须放在执行逻辑之前这个顺序我吃过亏——早期把权限判断写在末尾测试时用普通账号跑通了一条刷物品的命令上线当天就被玩家试出来了。sMapName取自玩家当前所在的地图对象别去查全局地图表跨地图传送的瞬间两边可能不一致。最后返回False把控制权交回脚本引擎这样脚本里定义的命令和代码里的命令就能共存不用改一处代码就重启一次服。验证方法很简单三步编译 M2Server → 用 GM 等级账号登录 → 在游戏里敲命令看回显同时看控制台有没有异常日志。跑通之后把同样的模式复制到“查怪物数量”“查在线人数”这类命令上就是纯体力活了。从那以后我每次给这类引擎加功能都强制走一遍“代码入口 → 权限判断 → 消息号同步 → 脚本兜底”这四步清单少一步就得在测试环境里反弹一次。折腾得多了才明白老引擎的代码不难难的是那些没写在任何文档里、只能靠失败才能学会的默认约定。希望这份拆解能帮你少折腾几个晚上。本文还有配套的精品资源点击获取

相关推荐

治理、芯片与开源:AI产业落地的三大工程支点
治理、芯片与开源:AI产业落地的三大工程支点

1. 为什么要同时关注治理、芯片与开源这三大主线最近跟同行聊技术趋势,发现一个很有意思的现象:以前大家碰面聊的是模型刷分、Prompt调优、微调技巧,现在聊的却是另一套话题——这个模型的合规边界在哪、算力芯片的能效比还能不能撑住下一代参… · 2026/11/2 20:06:32

Univer:为AI Agent打造可编程的Office运行时
Univer:为AI Agent打造可编程的Office运行时

1. 为什么“AI Agent 的 Office 运行时”是个真问题1.1 从一个具体场景说起:Agent 要改表格,但它没有“手”我最早意识到这个问题的严重性,是在做一个财务对账类 Agent 的时候。需求听起来很简单:让 Agent 读取一张 Excel 报表&am… · 2026/11/2 20:06:32

WorkBuddy 开发 Android 混合 App 实战:WebView 集成与十六个坑
WorkBuddy 开发 Android 混合 App 实战:WebView 集成与十六个坑

1. 从零到上线:为什么我选择用 WorkBuddy 走完整个 App 开发链路去年年底我接了一个内部工具类的 App 项目,需求不算复杂——一个带 WebView 的混合应用,Android 端为主,需要能快速迭代、方便非技术同事也能参与内容维护。当时摆在… · 2026/11/2 20:06:32

AI内容格式转换全攻略:Typora、飞书与AI导出鸭对比
AI内容格式转换全攻略:Typora、飞书与AI导出鸭对比

1. 问题背景与痛点分析在日常使用DeepSeek等AI平台时,我们经常需要将生成的内容复制到Word文档中。但这个过程往往会遇到令人抓狂的格式问题:数学公式变成乱码、表格边框神秘消失、文字间距错乱不堪。这些问题不仅影响文档美观,更会严重降低工… · 2026/11/2 20:59:02

VoiceStudio实战指南:从录音、AI配音到声音克隆
VoiceStudio实战指南:从录音、AI配音到声音克隆

1. VoiceStudio 到底解决什么问题第一次听到 VoiceStudio 这个名字,我以为是某个录音棚的配套软件。实际上它是一个把“录声音、修声音、造声音、合成声音”全部装进同一个工作流的语音创作项目。简单说,你既可以拿它录一段真实的语音,也能用… · 2026/11/2 20:59:02

智能经济新形态:技术架构与产业实践解析
智能经济新形态:技术架构与产业实践解析

1. 政策与产业动态解读:智能经济新形态的底层逻辑2023年政府工作报告首次提出"打造智能经济新形态"的战略方向,这标志着我国数字经济发展进入深水区。从技术架构层面看,智能经济新形态包含三个核心要素:数据要素市场化配… · 2026/11/2 20:59:02

智能喂鸟器边缘计算实践:算法合规与本地化部署
智能喂鸟器边缘计算实践:算法合规与本地化部署

1. 项目背景与核心挑战去年帮朋友改造花园时,我注意到他书架上积灰的智能喂鸟器——这个曾众筹百万美元的产品,最终因数据合规问题被迫退出欧洲市场。这让我意识到:硬件出海只是第一步,算法合规才是真正的生死线。智能喂鸟器的核心… · 2026/11/2 20:59:02

后见之明偏差:如何把“事后诸葛”变成决策校准工具
后见之明偏差:如何把“事后诸葛”变成决策校准工具

你有没有过这样的经历:项目上线之后出了事故,你一拍大腿——“我早就觉得这个方案有问题!”结果翻出当时的聊天记录,你原话明明是“这个方案可以试试”。这种“事后什么都清楚”的感觉,英语里有个专门的说法叫hindsigh… · 2026/11/2 20:59:02

网页天气可视化工具开发:API调用与Canvas渲染实践
网页天气可视化工具开发:API调用与Canvas渲染实践

1. 项目概述:网页天气可视化工具开发实录去年夏天连续两周的暴雨预警让我意识到,市面上大多数天气应用都只提供枯燥的数字预报。作为前端开发者和数据可视化爱好者,我决定动手打造一个能直观展现天气变化的网页应用。这个项目融合了第三方天气… · 2026/11/2 20:58:01

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战: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 步进电机驱动实战解析
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/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
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/2 5:17:18

雷达信号调制技术解析:从LFM到伪线性调频原理与应用
雷达信号调制技术解析:从LFM到伪线性调频原理与应用

/* 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 1:01:15

基于MAX14431与TM4C123的工业SPI隔离电路设计全攻略
基于MAX14431与TM4C123的工业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/2 1:01:15

PLFM_RADAR:相位线性调频雷达信号处理框架
PLFM_RADAR:相位线性调频雷达信号处理框架

/* 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 1:01:15

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战: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 步进电机驱动实战解析
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/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
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/2 5:17:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码