PS2手柄嵌入式遥控方案:通讯协议与驱动实现详解
简介面向STM32/MCU开发者的PS2手柄通讯手册讲解单片机与手柄间的串行协议、引脚及按键解析适合遥控机器人、平衡小车等嵌入式项目。文档为1个PDF146KB精简速查。详解接收器9个引脚DI/DAT、DO/CMD、GND、VDD、CS/SEL、CLK、ACK信号流向梳理读取时序拉低CS发0x01取ID0x41绿灯、0x73红灯再发0x42请求手柄回0x5A后返9字节数据Data[3]~[4]对应SELECT、START、方向键及□△○╳Data[5]~[8]为摇杆模拟值且区分红/绿灯模式差异。文末附STM32平衡车接线DI→PB14、DO→PB15、CS→PB12、CLK→PB13。已有857人学习下载可参照协议时序快速完成PS2手柄的按键采集与摇杆读取。1. PS2 手柄通讯手册及使用说明一个被低估的嵌入式遥控方案PS2 手柄通讯手册及使用说明听起来像是给二十多年前的老游戏机写考古笔记但实际上它在嵌入式领域一直没退场。一块几十块钱的单片机板子配一只 PS2 手柄就能拿到两个模拟摇杆、十四个按键和两组震动电机的完整输入输出通讯协议是公开的串行时序不需要蓝牙协议栈、不需要处理配对加密这是很多开发者在做机器人遥控、舵机云台、电动滑板控制时第一版方案的首选。这篇笔记把 PS2 手柄从引脚到驱动完整拆开讲清楚适合正在做单片机、嵌入式改造和遥控设备的工程师与爱好者你会知道它靠什么通讯、数据怎么解析、哪些地方几乎每次都会翻车以及怎么把它接到你自己的项目里。下面直接进入协议层。2. 通讯协议拆开看比特、字节与握手时序2.1 为什么 PS2 手柄适合做嵌入式输入源做遥控类产品的输入源常见选择是蓝牙手柄、NRF24 自组遥控器和 PS2 手柄。蓝牙手柄方案要处理配对、HID 协议、电池管理和掉线重连开发周期按周算NRF24 自组方案要自己定义按键映射和摇杆量化协议栈全自己写调试时一个字节错位就够折腾。PS2 手柄的协议是“主机发起、从机应答”的单主机 SPI 模型单片机是唯一的主设备CLK、CMD、ATT 三条线都由单片机控制只有 DAT 一根线回传时钟节奏完全掌握在主机手里不存在传统串口那种收发不同步的问题。另一个优势是成本。PS2 手柄的保有量极大二手市场上有线手柄和配套接收器都很便宜而且协议文档早被社区整理得明明白白。接口是标准 9 针线序固定不需要自己画高频板和天线。对于遥控小车、机械臂、舵机云台这类产品PS2 手柄往往比蓝牙方案更快进入可用状态这也是它在 2025 年的今天仍然频繁出现在开源项目和课程设计里的原因。2.2 9 字节数据帧的每一位都代表什么通讯以“帧”为单位一帧 9 个字节。主机把 ATT 拉低代表“我要开始通讯了”然后在 CLK 的驱动下连续发送 9 个字节每发送一个字节的同时从 DAT 线上读回一个字节。主机发出的 9 个字节格式固定第 1 字节是启动命令 0x01第 2 字节是地址 0x42后面 7 个字节通常填充 0x00。手柄回传的 9 个字节才是有用的数据对应关系如下回传字节索引常见值含义00xFF应答起始标识10x41 / 0x73 / 0x79工作模式数字模式 / 模拟模式 / 模拟模式20x5A数据有效标识读到 0x5A 才说明本次通讯成功3按键状态 1SELECT、L3、R3、START、上、右、下、左4按键状态 2L2、R2、L1、R1、三角、圆圈、叉、方块50x00–0xFF左摇杆 X 轴居中约 0x8060x00–0xFF左摇杆 Y 轴居中约 0x8070x00–0xFF右摇杆 X 轴居中约 0x8080x00–0xFF右摇杆 Y 轴居中约 0x80注意按键状态里的位逻辑是反的手柄内部使用上拉电路按键没按下时对应位是 1按下时被拉低变成 0。解析时必须取反否则你会看到一个“所有键都在按着”的诡异状态。摇杆则没有方向区分它是一个 0 到 255 的绝对位置值中心约 128向左上和左下是 0向右下是 255。2.3 250kHz 时序与硬件 SPI 的冲突点PS2 手柄的通讯时序虽然长得像 SPI但它跟单片机硬件 SPI 外设有两个明显冲突。第一它的数据输出是半双工的所有数据都从 DAT 一根线上走而硬件 SPI 的 MOSI 和 MISO 是分开的直接挂上会导致数据方向冲突。第二它的位序和时钟极性没有统一标准不同驱动库有 LSB 先行、也有 MSB 先行硬件 SPI 的 CPOL/CPHA 组合并不能覆盖所有手柄型号。我一般把 CLK 频率控制在 250kHz 左右也就是每个时钟周期 4 微秒高电平 2 微秒、低电平 2 微秒。频率再高部分兼容手柄和无线接收器会丢位频率太低通讯速度会影响摇杆采样率。这里最可靠的做法不是依赖硬件 SPI而是用 GPIO 软件模拟代码可控、时序可调、出问题好排查。下一章先把硬件接好我们把 FT 脚、ATT 脚这些容易接错的地方一次性讲清楚。3. 硬件接线从 9 针定义到电平适配3.1 标准 9 针引脚定义与直连方式的坑PS2 手柄或者无线接收器引出的是一个 9 针母头线序是固定的但很多人拿到实物后对着丝印看了半天因为上面不会印“DAT”“CMD”这样的名称。标准定义如下引脚号名称方向说明1DAT手柄 → 主机数据输出线开漏输出2CMD主机 → 手柄命令输入线39V / NC—部分原装手柄是 9V 供电一般悬空不用4GND—地线和 9 脚连通5VCC—供电5V约 30–50mA6ATT主机 → 手柄片选线低电平有效7CLK主机 → 手柄时钟线8NC—空脚9GND—地线有线手柄和无线接收器的线序相同只是无线接收器在主机端多加了一次无线到有线的解码时序上会有额外延迟。直连方式最常踩的坑是把 3 脚当成电源来供电或者把 4 脚和 9 脚中的某个当成唯一的 GND结果开工前就把手柄烧了。3 脚在原装手柄的设计里确实是 9V 输入但现代驱动方案都用 5V 供电3 脚保持悬空即可。4 脚和 9 脚是内部连通的只接 4 脚也行但建议两个都接减少回路阻抗。3.2 3.3V 与 5V 混接DAT 开漏上拉不能省这是 PS2 手柄项目里最容易翻车的硬件问题。手柄本身工作在 5V 逻辑电平ATT、CMD、CLK 都是主机输出的高电平信号如果主控是 3.3V 单片机直接输出 3.3V 高电平对手柄内部电路来说可能达不到输入高电平阈值导致指令不被识别。反方向更麻烦手柄的 DAT 是开漏输出需要外部上拉电阻才能把数据拉高你不加上拉DAT 会一直维持浮空状态读回来的数据不是 0xFF 就是乱码。对 5V 单片机DAT 线上加一个 10kΩ 电阻上拉到 5VCMD、CLK、ATT 直接连过去就能工作。对 3.3V 单片机常见做法是给 DAT 上拉到 5V然后用两个电阻分压例如 1kΩ 串联加 2kΩ 对地分压把 5V 数据降到约 3.3V再接 MCU 的输入引脚。CMD、CLK、ATT 这三个主机输出方向则要反过来用 MOSFET 电平转换芯片把 3.3V 信号拉高到 5V不能用电阻分压因为这是单向驱动问题。3.3 无线接收器与有线手柄的区别有线手柄和无线接收器的通讯行为在协议层面完全一致但无线接收器有两个额外特性要习惯。一是上电后它内部要初始化无线链路最快也要几十毫秒慢一点的兼容接收器要一百多毫秒你必须在初始化代码里给足等待时间否则第一次读帧全是 0xFF。二是无线传输会引入约 1–2 毫秒的随机抖动CLK 频率超过 250kHz 后连续读帧偶尔会出现某一帧数据整体错位。我通常把初始化流程写成“上电延时 200ms → 尝试读一帧 → 校验 0x5A → 失败则每 50ms 重试一次最多重试 5 次”。这样既兼容有线手柄的立即响应也兼容无线接收器的慢启动。如果项目允许建议先拿有线手柄调完协议再换无线接收器验证时序余量能省掉不少来回猜问题的时间。4. 把协议跑起来最小驱动代码与按键解析4.1 最小驱动软件模拟 SPI 的 read_frame 函数接线确定后驱动层的核心就是实现一个软件模拟的字节移位函数。下面这套是我在多个项目里反复用过的 C 代码骨架位序按 LSB 先行实现时钟用 250kHz。引脚定义按你自己的板子调整。// ps2_driver.c // 引脚定义按你自己的板子调整 #define PS2_CLK PC0 #define PS2_DAT PC1 // 输入带上拉 #define PS2_CMD PC2 #define PS2_ATT PC3 // 发一个字节的同时读回一个字节 // 位序LSB 先行先发 bit0 static uint8_t ps2_shift(uint8_t data) { uint8_t recv 0; for (uint8_t i 0; i 8; i) { // 主机准备 CMD 数据 if (data 0x01) { PS2_CMD_HIGH(); } else { PS2_CMD_LOW(); } // 时钟上升沿主机输出有效 PS2_CLK_HIGH(); delay_us(2); // 2us配合低电平 2us约 250kHz // 时钟下降沿从机输出有效主机采样 DAT PS2_CLK_LOW(); delay_us(2); // 读取回传位写入 recv if (PS2_DAT_READ()) { recv | (0x80 i); // 注意这里把收到的位拼到高位 } data 1; } return recv; } // 读取一帧结果存入 rx[0..8] void ps2_read_frame(uint8_t rx[9]) { PS2_ATT_LOW(); // 拉低片选启动通讯 // 第一字节启动命令 rx[0] ps2_shift(0x01); // 第二字节读数据地址 0x42 rx[1] ps2_shift(0x42); // 后续 7 个填充字节 for (uint8_t i 0; i 7; i) { rx[i 2] ps2_shift(0x00); } PS2_ATT_HIGH(); // 拉高片选结束通讯 }这段代码的核心逻辑是把 PS2 协议压缩成一个 8 次的循环每次循环完成“主机发 1 位、从机回 1 位”的交换。ps2_shift 的参数 data 是主机要发送的字节返回值 recv 是手柄同时回传的字节。rx 数组里最终的数据对应前面表格中的九字节结构但要注意 rx[0] 通常是 0xFFrx[2] 才是 0x5A 数据有效标识。如果你读到的 rx[2] 不是 0x5A说明这次帧通讯失败需要整帧重读。参数方面CLK 频率由 delay_us 决定2 微秒对应 250kHz 左右这是兼容原装手柄和第三方手柄的常用值。PS2_DAT 的读取时机放在 CLK 下降沿之后目的是给从机足够的输出建立时间。如果你的主控跑得很快可以把 delay_us 调到 1.5但不要低于 1否则绿色兼容手柄很容易出错。4.2 按键与摇杆解析从 raw 数据到可用的控制量拿到 rx 数组后下一步是把按键状态和摇杆值拆出来。这一步的独门细节是按键按下的逻辑电平是 0要反转摇杆的原始值范围是 0–255需要转为 -128 到 127 才能和方向概念对应。// ps2_parser.c // 按键按下判定手柄上拉按下为 0未按为 1 static uint8_t ps2_key_pressed(uint8_t raw, uint8_t bit) { return (raw (1 bit)) 0; } // 解析一帧结果写入 struct void ps2_parse(const uint8_t rx[9], ps2_state_t *s) { // 第 3、4 字节是按键状态 s-select ps2_key_pressed(rx[3], 0); s-l3 ps2_key_pressed(rx[3], 1); s-r3 ps2_key_pressed(rx[3], 2); s-start ps2_key_pressed(rx[3], 3); s-up ps2_key_pressed(rx[3], 4); s-right ps2_key_pressed(rx[3], 5); s-down ps2_key_pressed(rx[3], 6); s-left ps2_key_pressed(rx[3], 7); s-l2 ps2_key_pressed(rx[4], 0); s-r2 ps2_key_pressed(rx[4], 1); s-l1 ps2_key_pressed(rx[4], 2); s-r1 ps2_key_pressed(rx[4], 3); s-triangle ps2_key_pressed(rx[4], 4); s-circle ps2_key_pressed(rx[4], 5); s-cross ps2_key_pressed(rx[4], 6); s-square ps2_key_pressed(rx[4], 7); // 摇杆原始 0–255转成 -128 到 127 s-lx (int8_t)(rx[5] - 128); s-ly (int8_t)(rx[6] - 128); s-rx (int8_t)(rx[7] - 128); s-ry (int8_t)(rx[8] - 128); }解析函数里rx[3] 对应十字键和 SELECT、STARTrx[4] 对应肩键和四个动作键。注意这个顺序不是随意的它是手柄协议固定的返回顺序写错位会导致“按方块键结果输出三角键”的奇怪现象。ps2_key_pressed 把位值为 0 判定为按下与前面表格里的逻辑一致。摇杆转成有符号数之后居中值从 128 变成 0左和上为负右和下为正。但要注意机械摇杆有个特点它永远回不到精确的 128会有几个 LSB 的漂移。直接拿这个数据去控制电机会让设备在静止时出现缓慢漂移。实际项目里应该在解析后加一个死区判断绝对值小于等于 4 的输入直接当作 0后面进阶章会给出具体实现。4.3 震动与配置模式两条额外的命令序列要开启震动不能直接用 0x42 读地址。手柄出厂时默认处于数字模式电机反馈是关闭的必须先发送配置序列进入模拟模式再单独设置电机强度。这是一段容易写错的代码因为发送的字节数和顺序在不同手柄上有细微差异但下面这套基础序列能兼容大多数原装手柄// 进入配置模式 void ps2_enter_config(void) { PS2_ATT_LOW(); ps2_shift(0x01); ps2_shift(0x43); // 0x43 表示“进入配置” ps2_shift(0x00); ps2_shift(0x01); ps2_shift(0x00); ps2_shift(0x00); ps2_shift(0x00); ps2_shift(0x00); ps2_shift(0x00); PS2_ATT_HIGH(); } // 开启震动映射 void ps2_enable_rumble(void) { ps2_enter_config(); PS2_ATT_LOW(); ps2_shift(0x01); ps2_shift(0x42); // 0x42 读地址覆盖为映射设置 ps2_shift(0x00); ps2_shift(0x00); ps2_shift(0x00); ps2_shift(0x00); ps2_shift(0x00); ps2_shift(0x00); ps2_shift(0x00); PS2_ATT_HIGH(); } // 设置震动强度小马达 0–255大马达 0–255 void ps2_set_rumble(uint8_t small, uint8_t large) { PS2_ATT_LOW(); ps2_shift(0x01); ps2_shift(0x42); ps2_shift(0x00); ps2_shift(0x00); ps2_shift(0x00); ps2_shift(small); // 第 6 字节小马达设定 ps2_shift(large); // 第 7 字节大马达设定 ps2_shift(0x00); ps2_shift(0x00); PS2_ATT_HIGH(); }震动命令的字节位置比较讲究small 和 large 分别对应回传字节序列里的第 6、第 7 位也就是主机在发送时填充的第 6、第 7 个字节。如果震动不生效先确认手柄是不是第三方兼容型号部分兼容手柄需要把 large 映射放到 small 之前那是手柄自身的映射 bug只能按实测调整。配置模式还有一个隐含的坑每一次 ps2_enter_config 都会让手柄暂离工作状态频繁进入会导致手柄内部状态机错乱。稳妥的做法是在系统初始化时开启一次震动映射之后只调 ps2_set_rumble不再反复进入配置模式。5. 避坑名单实际项目里最常见的 4 个故障5.1 读回数据全是 0xFFDAT 上拉被遗漏现象rx 数组所有字节都是 0xFF按键怎么按都没有反应用万用表量 DAT 引脚永远是高电平。原因DAT 是开漏输出手柄内部没有上拉能力外部电路如果没接上拉电阻引脚就处于浮空状态主控读到的永远是默认高电平。解决在 DAT 到 VCC 之间接一个 10kΩ 上拉电阻。5V 系统直接上拉到 5V3.3V 系统可以把 DAT 上拉到 5V 再通过分压进主控引脚。加上这个电阻后按下一个键对应位会被拉低数据马上恢复正常。5.2 用硬件 SPI 导致数据错位现象用 STM32 或 AVR 的硬件 SPI 外设连接手柄读数据时有时正常有时整体后移一位换了时钟极性组合后正常帧概率略有变化但没根治。原因PS2 协议的半双工 DAT 线和硬件 SPI 的 MISO 采样时刻对不齐加上不同手柄的建立时间不一致导致采样点落在边沿附近数据被判断成前一位或后一位。解决放弃硬件 SPI 外设使用 GPIO 软件模拟采样点固定放在 CLK 下降沿之后 2 微秒。代码改完后再观察连续读 1000 帧的数据正常率应该接近 100%如果还有单帧错位优先检查 delay_us 的实际时间是否被中断函数拖长。5.3 无线手柄上电后前 100ms 内读不到数据现象单片机上电执行初始化第一个 ps2_read_frame 读回的帧里没有 0x5A连续读都失败但等程序运行一两秒后再按按键一切正常。原因无线接收器上电后要先完成内部固件启动和无线链路同步这个过程需要几十到两百毫秒。主机在此时发命令接收器还没准备好应答。解决初始化时加一个 200ms 延时再做失败重试。重试间隔取 50ms连续失败 5 次后可以报错或重启接收器供电。注意不要用 while(1) 死等单一帧无线链路的偶发丢帧是正常的要允许重试。5.4 第三方手柄的模式号和按键映射错乱现象读回的模式字节不是 0x41 或 0x73而是 0x79、0xFF 或其它值按键解析后按下“上”键反而触发了“方块”键。原因第三方兼容手柄的映射表不遵循原装规范尤其是按键位和模式标识位存在差异这类手柄又叫它“黑色的盒子”黑匣子行为只能靠实测。解决系统启动时先打印模式字节和几个按键的原始位建立一个简单的映射学习流程。例如把模式号保存到一个配置数组里以后读帧时先按模式号查映射表查不到就按原装规则解析然后用摇杆和少数几个通用按键先完成核心功能。不要试图在驱动层一次兼容所有第三方手柄那是无底洞。6. 进阶玩法把 PS2 手柄变成通用遥控节点基础协议跑通后下一步是把手柄接入真实系统。我一般会在 ps2_parse 输出后立刻做三层处理死区、映射、重发。死区解决摇杆回中漂移映射解决“手柄的物理方向”和“执行器的控制方向”不一致重发则是把数据打包成串口或蓝牙帧让另一端的 MCU 直接使用。死区实现很简单前面解析出带符号摇杆值之后做一个双向绝对值判断int8_t deadzone(int8_t v, int8_t dead) { if (v -dead v dead) { return 0; } return v; } // 实际使用int16_t speed deadzone(s-ly, 4) * 2;死区选 4 还是 8取决于手柄的磨损程度。旧手柄摇杆漂移明显死区要放到 10 以上但代价是低速控制时有一段“空行程”。我习惯把死区值和最大输出值做成宏调试时用 OLED 屏幕实时显示摇杆原始值这样不需要猜直接把漂移量打印出来就能定死区参数。映射层解决的是方向盘一致性问题。比如遥控小车手柄竖直向上推代表前进但电机安装方向可能导致转速值是反的此时只需要把符号翻转。这种映射逻辑不要写在驱动里写在应用层方便不同项目复用同一个驱动文件。重发层把解析后的按键和摇杆值打包成固定帧格式例如 3 字节帧帧头、按键位、摇杆值然后通过串口发出。另一端解析时也按这个格式就能快速拼出一个远程控制链路。我自己的习惯是任何 PS2 手柄项目至少加一个 OLED 或串口调试输出上电后滚动显示 rx[2] 的值、模式号和摇杆中心值。这样做的好处是能在一分钟内确认协议是否跑通、手柄型号是否兼容而不是两眼一抹黑地盲调。手柄这种外设玄学问题大多来自接线和上拉剩下的时序问题靠延时和采样点就能解决真正没法控制的只有第三方兼容手柄的映射表。希望这篇笔记能帮你在做遥控项目时少走几步弯路把更多时间留给业务逻辑本身。本文还有配套的精品资源点击获取

相关新闻

手写可访问Tab组件:ARIA规范与状态驱动实现

手写可访问Tab组件:ARIA规范与状态驱动实现

1. 这个Tab切换功能到底在解决什么问题?“编写js实现Tab栏切换(点击不同块的时候出现不同的文本信息)”——这行标题看起来简单,但背后藏着前端开发里最基础、也最容易被低估的交互逻辑。我带过不少刚入行的前端新人,发…

2026/10/15 22:07:37 阅读更多 →
现代CMake实战:从target到依赖传递的C++构建指南

现代CMake实战:从target到依赖传递的C++构建指南

1. 为什么一个C老手也会在CMake上翻车刚入行那会儿,我对构建工具的态度是能躲就躲。写几个源文件,g main.cpp -o app一行命令搞定,干净利落。直到某天接手一个稍微像样点的工程——十几个源文件、三四个第三方依赖、还要同时支持Linux和Windo…

2026/10/15 22:06:34 阅读更多 →
独立游戏Q4冲刺:联机与UI重构及百日自律打卡实战

独立游戏Q4冲刺:联机与UI重构及百日自律打卡实战

1. 独立游戏周报背后的开发节奏与自律体系1.1 为什么用“周报”驱动独立游戏开发做独立游戏的人都有一个共同的痛点:没人管你。没有项目经理追进度,没有同事问你今天干了啥,所有的节奏全靠自己撑。我见过太多有才华的开发者,技术不…

2026/10/15 22:06:34 阅读更多 →

最新新闻

C语言笔试算法18题:内存与指针驱动的闭环训练体系

C语言笔试算法18题:内存与指针驱动的闭环训练体系

1. 这不是题库搬运,而是一套可闭环复用的C语言算法训练体系“18个笔试考试算法 C语言”——看到这个标题,很多人第一反应是:又一个刷题合集?点开就背代码?先别急着划走。我带过几十届校招辅导班,也参与过多…

2026/10/15 22:57:23 阅读更多 →
函数极限与连续考点全梳理:从极限计算到间断点与零点定理

函数极限与连续考点全梳理:从极限计算到间断点与零点定理

简介:本资源为函数极限与连续专题练习题PDF,适合高等数学初学者巩固概念或备考阶段自测使用。内容围绕极限存在性、连续性、同阶与高阶无穷小、无穷小量等价性等核心考点,共设置14道选择题,并配有完整题干与选项,便于读…

2026/10/15 22:57:23 阅读更多 →
前后端分离实践:Vue3+SpringBoot游戏商店系统开发详解

前后端分离实践:Vue3+SpringBoot游戏商店系统开发详解

1. 从需求到架构:游戏商店系统到底在解决什么问题不少同学看到"基于PHP、asp.net、java、Springboot、SSM、vue3的基VUE的游戏商店系统"这个标题时,第一反应是"疯了,怎么这么多技术栈揉在一起"。其实把这个标题拆开看&am…

2026/10/15 22:57:23 阅读更多 →
18bits Sigma-Delta DAC设计:架构选型、调制器与数字滤波器全解析

18bits Sigma-Delta DAC设计:架构选型、调制器与数字滤波器全解析

简介:这份资源是哈尔滨工业大学2014年工学硕士学位论文《18bits Sigma-Delta DAC的设计》,面向具备电子工程基础、对数模转换与Sigma-Delta技术有一定了解的研发人员和技术爱好者,帮助读者理解高精度、大带宽数模转换器的系统级设计原理与实现…

2026/10/15 22:57:23 阅读更多 →
单卡跑大模型:airllm分层推理与量化压缩实战指南

单卡跑大模型:airllm分层推理与量化压缩实战指南

1. 单卡跑大模型这件事,到底卡在哪第一次看到 airllm 这个项目的时候,我正在一台只有单张消费级显卡的机器上折腾一个 70B 级别的模型。显存报错几乎是必然的,OOM 的红色提示刷了满屏,那种感觉就像你明明有一整间仓库的货&#xf…

2026/10/15 22:57:23 阅读更多 →
Claude Code + DeepSeek 从零安装教程:面向纯小白,6 步拥有自己的 AI 编程助手|TaoToken 统一 Key 接入

Claude Code + DeepSeek 从零安装教程:面向纯小白,6 步拥有自己的 AI 编程助手|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/15 22:56:22 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →