用C语言中断方式实现旋转编码器方向识别与状态机设计
做嵌入式开发的朋友对旋转编码器应该都不陌生。音量旋钮、仪器调节、菜单翻页很多时候我们面对的就是这么一个小小的旋钮。这个项目做的是用C语言以中断方式实现旋转编码器的方向识别并且编码器本身存在空闲状态。说直白一点旋钮平时安静地停在某档位上A、B两路信号都没有边沿变化用户突然拧了一下系统要在第一下脉冲时立刻判断是顺时针还是逆时针整个识别过程还不能把MCU的CPU时间吃掉太多。这个需求听起来简单实际上翻车点不少——方向错、乱计数、高速丢步、上电第一圈就错都是常见问题。这篇文章就从一套能跑的完整实现出发把技术点拆开讲清楚适合需要在自己项目里移植编码器驱动的嵌入式开发者和电子爱好者参考。1. 项目需求与核心思路1.1 旋转编码器输出的本质两路脉冲的相位关系机械旋转编码器一般输出两路矩形波信号习惯上叫A相和B相。轴旋转时两个触点会先后接通或断开从MCU的视角看就是两路相互错开90°电角度的方波也叫正交信号。拧得越快脉冲频率越高拧到某一档位停下来时两路都保持当前电平不再变化进入空闲状态。这里要建立的最重要概念就是方向信息不在单个引脚里而在两路信号的先后顺序里。举个生活类比就像两个人轮流举手先举手的是A、后举手的是B那么这一轮就代表正转下一次反过来先B后A就代表反转。编码器方向识别实际上就是判断这种先后关系而不是单纯看哪一路出现了脉冲。1.2 为什么这个项目坚持用中断方式一些人会想我定时读引脚状态再对比前后状态不也能判断方向吗确实可行但轮询方式有两个天然劣势。一是实时性差编码器转得快时两路脉冲间隔可能只有一两百微秒。如果系统里还有其他任务轮询周期一变大就会漏掉某个中间状态方向自然就判断不出来。二是费CPU为了不漏状态只能把轮询周期压得很短哪怕旋钮一直静止MCU也要一直空转去读引脚。中断方式则完全不同引脚电平一旦变化硬件会自动触发中断软件立即读取状态并处理旋钮静止时没有任何中断CPU几乎零负担。这个优势在很多产品场景里都非常关键尤其是功耗敏感和任务多的系统。1.3 “有空闲状态”这个条件到底难在哪标题里专门点出来“编码器有空闲状态”很容易被忽略但它才是很多实现会翻车的根源。编码器静止时A、B引脚可能是任意组合比如都处于高电平。很多初学者的代码会假设系统上电时A、B一定是什么固定的值或者在第一次进入中断时才初始化上一次状态。这就会出问题如果编码器在开机前已经拧到了某个位置第一次转动时进入中断的当前状态和默认上一次状态之间没有必然联系查表后方向就可能反。正确的做法是在初始化阶段就读一次A、B电平把组合保存下来作为空闲状态的基线之后每来一次中断都拿新的组合和上一次组合比较查方向增量表。这样不管编码器停在哪个档位、从哪个方向开始转第一下就可以得到正确方向。这是状态机方案的优势也是本项目正确性的基础。2. 硬件电路与信号调理2.1 机械编码器的典型接法这个项目里的硬件结构很简单但要接对。常见的带定位手感机械编码器有三个功能引脚同时还有一个公共端引脚。以公共端接GND的接法来说A、B两路通过内部金属触点开关连接到地平时触点断开MCU读到的是上拉后的高电平转动时触点闭合引脚被拉到低电平。所以硬件设计的要点是给A、B做好上拉。很多独立模块自带上拉电阻但有些散装的编码器没有不能想当然。我的建议是初始化代码里开启MCU内部上拉同时外部再加一个10kΩ上拉到VCC双保险。电位上拉不稳会导致引脚在高低电平之间漂移表现为不转动也频繁触发中断。2.2 消抖电容与RC时间常数的估算机械编码器的触点本来就是机械结构转动时接触点会在极短时间内反复通断产生抖动毛刺。这些毛刺反映在电平上就是非常窄的脉冲软件层可以过滤一部分但硬件上做简单处理会更省心。常见的做法是在A、B引脚对地各加一个10nF到100nF的电容配合上拉电阻构成RC低通滤波。以10kΩ配10nF为例时间常数τRC100微秒可以滤掉绝大多数抖动毛刺。这个数值对百赫兹级别的旋转脉冲完全够用但要注意电容不要加太大。如果换成1μF时间常数就变成10ms脉冲边沿会被拉得很缓MCU可能在中间阈值附近反复触发反而更容易误判。经验值来讲普通旋钮场景选10nF比较合适能跑较快的手速也不会被毛刺折磨。2.3 示波器确认相位关系与毛刺接好线之后不要急着写代码。建议先拿示波器两个通道同时测量A、B引脚手拧几次旋钮观察波形。正常时能看到两路错开90°的方波顺时针时一路先沿逆时针时另一路先沿。同时看沿附近有没有毛刺如果有就需要调整RC参数。这里有个简单经验如果毛刺出现在触点上波形连续跳动说明抖动严重如果只是偶尔一个沿上有小幅反弹软件状态机基本能过滤。示波器还能帮你确认编码器的输出逻辑比如是上拉高有效还是下拉低有效不然代码方向表和实际硬件对不上调试半天发现只是接线逻辑反了。2.4 接线要点速查编码器引脚推荐接法备注A相MCU外部中断输入开启内部上拉外接10kΩ上拉对地10nF滤波电容B相MCU普通输入开启内部上拉同样外接上拉和滤波电容公共端接GND若模块公共端是VCC则上下拉关系要反过来上拉电源3.3V或5V与MCU电平匹配3. 方向识别算法为什么用状态机3.1 只在一个中断里读另一路电平为什么不够可靠最直观的方向识别法是让A相触发中断在A相中断里读一下B相的电平。A上升沿时B是高还是低决定正转还是反转A下降沿时B的状态又可以再判断一次。代码只有几行看起来很简单。这种方法在信号非常理想、转速稳定时确实能用但有两个缺陷。第一如果旋钮停在正好让A相边沿来回抖动的档位附近一个机械步进去可能会产生多个虚假边沿程序每进来一次都按同样的规则累加计数就会乱跳。第二它只利用了A相的边沿信息B相如果在某个短暂时刻里发生了抖动程序根本不知道状态就错了。旋转编码器的方向信息分布在两路信号上只盯一路信号本质上就丢了一半信息。3.2 四状态环形路线的直觉理解更好的是把A、B两个引脚看作一个2位二进制状态。电平组合只有四种00、01、10、11。编码器转动的过程就是这四种状态在相邻状态之间连续迁移的过程。把这四种状态排成一个环形路线合法的转动只会沿相邻状态移动一格且同一方向的每一次移动都对应同一个方向。比如可以定义一组正交序列 00→01→11→10→00 为正方向那么反过来 00→10→11→01→00 就是反方向具体哪个方向叫正完全由你的定义决定代码里调整符号即可。这是“格雷码”的规律相邻状态之间只有一个位发生变化。如果突然从00直接跳到11中间跳过一个状态说明大概率碰上了抖动毛刺应该忽略这次变化。这个环形路线的概念非常重要理解了它后面的查表代码其实就是把这张路线图翻译成数字。3.3 方向增量表的查表原理既然合法状态迁移只发生在相邻状态之间那就可以预先把所有“旧状态→新状态”的组合可以带来的增量列成一张表。旧状态4种新状态4种一共16种组合合法组合对应1或-1非法组合和相同状态对应0。程序每次进入中断只需要用旧状态和当前状态做一次查表就得到本次旋转的方向增量。查表法的优点是判断时间固定代码执行路径短非常适合中断服务函数而且增量表的数据可以设计成符合正交信号规律不管旋钮从空闲什么位置开始转动只要上一次状态保存正确下一次查表结果就是对的。相比if-else判断查表没有分支风暴也不容易漏方向这一点在高速旋转时优势明显。3.4 我实际使用的方向增量表状态编码采用code (A 1) | B所以10代表A引脚为高、B引脚为低其他以此类推。横向是当前状态纵向是上一次状态表格里的数值就是本次方向增量旧状态 \ 新状态00011011000-11001100-110-10011101-10这张表对应的正方向序列是00→10→11→01→00反方向序列是00→01→11→10→00。如果你希望符号反过来直接把表格里的 1 和 -1 整体对调或者把A、B两根线对调效果是一样的。这个表的最大特点是非法跳变全部返回0天然过滤了一部分抖动。4. 完整C语言实现与移植说明4.1 初始化流程不管用哪款MCU初始化的逻辑都是一样的使能GPIO时钟把A、B改成输入模式。开启内部上拉电阻。把A、B两路外部中断配置成双边沿触发。这里有一个关键点两路都建议配成中断而不是只配A一路。只配A也能转起来但编码器从某个状态变到相邻状态时如果只有B相发生了边沿A不变化那么A的边沿中断就不会触发状态就推不动慢速旋转时容易出现漏步。延时几毫秒等引脚电平稳定读取当前状态保存为上一次状态。这个“稳定后采样”就是专门应对“有空闲状态”编码器的初始化方法。开启全局中断。4.2 中断服务函数的时间要求在ISR里只做三件事读引脚生成当前状态、查增量表、保存当前状态。最多再往一个volatile变量里累加计数。不要在ISR里调用打印函数不要做界面刷新不要用delay。很多人调试时习惯在中断里printf结果拧一次旋钮串口卡半天然后把锅甩给编码器方向识别。实际上机械编码器在低速旋转时中断频率不算高但一旦手速快每秒几十上百个中断printf就会让系统彻底卡死。正确做法是在ISR里只累计delta主循环通过函数读取并清空计数后再去做界面、串口等业务。4.3 平台无关的参考代码下面这段代码是平台无关风格只需要把引脚读取宏替换成你自己的库函数即可。// encoder_drv.h #ifndef ENCODER_DRV_H #define ENCODER_DRV_H #include stdint.h void Encoder_Init(void); void Encoder_ISR(void); int16_t Encoder_GetAndResetDelta(void); #endif// encoder_drv.c #include encoder_drv.h // 把下面这两个宏替换成你的MCU引脚读取函数 #define ENCODER_A_READ() GPIO_ReadPin(ENCODER_A_PORT, ENCODER_A_PIN) #define ENCODER_B_READ() GPIO_ReadPin(ENCODER_B_PORT, ENCODER_B_PIN) static volatile int16_t s_encoder_delta 0; static uint8_t s_prev_state 0; // 方向增量表: index (旧状态 2) | 新状态 static const int8_t s_dir_table[16] { 0, -1, 1, 0, // 旧状态 00 1, 0, 0, -1, // 旧状态 01 -1, 0, 0, 1, // 旧状态 10 0, 1, -1, 0 // 旧状态 11 }; void Encoder_Init(void) { // 1. 配置A、B引脚为输入模式打开内部上拉 // 2. 配置A、B引脚外部中断为双边沿触发 // 3. 延时等待电平稳定采样一次作为空闲基线 volatile uint32_t i; for (i 0; i 2000; i) { // 空循环延时实际工程建议用延时函数 } s_prev_state ((ENCODER_A_READ() ? 1U : 0U) 1) | (ENCODER_B_READ() ? 1U : 0U); } void Encoder_ISR(void) { uint8_t curr_state ((ENCODER_A_READ() ? 1U : 0U) 1) | (ENCODER_B_READ() ? 1U : 0U); uint8_t index (uint8_t)((s_prev_state 2) | curr_state); int8_t delta s_dir_table[index]; if (delta ! 0) { s_encoder_delta delta; } s_prev_state curr_state; } int16_t Encoder_GetAndResetDelta(void) { int16_t val; // 临界区保护防止主循环读取时刚好被中断打断 __disable_irq(); val s_encoder_delta; s_encoder_delta 0; __enable_irq(); return val; }这段代码的核心就是查表那一行。没有复杂的if嵌套没有分支预测的担忧执行时间非常固定。原项目采用的就是类似实现直接换到三款不同MCU上只改了引脚读取宏和中断入口函数名算法部分一行没动。4.4 主循环使用示例主循环里不需要关心边沿只需要周期性取走增量再刷新界面。下面的代码演示了限定范围菜单选项的写法#include encoder_drv.h static int16_t s_menu_index 0; static int16_t s_menu_min 0; static int16_t s_menu_max 9; void Menu_Task(void) { int16_t delta Encoder_GetAndResetDelta(); if (delta 0) { return; } s_menu_index delta; if (s_menu_index s_menu_min) { s_menu_index s_menu_min; } if (s_menu_index s_menu_max) { s_menu_index s_menu_max; } Menu_Display(s_menu_index); }这里有个习惯建议界面只在delta不为0时刷一次而不是每轮任务都刷。这样既减少闪烁也方便以后扩展出“空闲N秒”之类的逻辑。4.5 没有硬件时怎么验证算法如果你手头暂时没有编码器完全可以用信号发生器或者另一个MCU的GPIO模拟A/B方波。把两个GPIO按正交时序轮流输出高低电平每次间隔几毫秒到几十毫秒看主程序计数是否按要求累加。这个办法比手拧旋钮稳定得多能快速验证状态表方向定义是否正确。我在调试这个项目时就是先用软件模拟跑通了表再接实物省掉了很多硬件排查时间。5. 常见问题与排查记录5.1 方向反了这是最常遇到也最好解决的问题。原因基本只有两种A/B接线对调了或者方向表正方向定义跟预期不符。解决办法有两种一是硬件上把A、B两根信号线交换位置二是软件里把增量的符号取反。如果只是方向反、计数本身正常说明算法逻辑没有毛病不用怀疑状态表放心改符号就行。5.2 旋钮静止时计数乱跳这个问题的排查顺序很固定。先量静态电压正常时A、B引脚应该稳定在高电平或低电平如果电压在中间飘说明上拉或下拉没配置对。再确认是否真的开了内部上拉有没有其他外部下拉电阻把电平拉成中间态。接着看RC电容太小滤波效果差太大会让边沿变圆。最后用示波器抓波形看是不是机械触点本身抖动严重。这里有一个容易被忽视的深坑清中断标志的位置。有些MCU要求在进入中断后立刻清标志有些要求在读取引脚之后清。如果清得太早刚好边沿再次到来中断标志又置上退出ISR后再次进入看起来就像静止时不断乱跳。我遇到过类似问题排查了很久才发现是清标志顺序不对顺序调整后计数立刻安静了。5.3 快速旋转时丢方向多半原因是ISR执行时间太长、RC滤波时间常数太大或者中断被更高优先级的中断频繁抢占。先把ISR精简到最短再确认电容不能超过100nF然后用示波器看高速旋转时波形是否依然方整。还要确认编译优化等级调试版不开优化时查表代码可能比想象中慢不少。如果这些都没问题并且MCU主频确实有限那就需要考虑硬件定时器正交解码模式后面我会展开说。另外机械编码器本身也有最高响应频率便宜型号在高转速下触点根本跟不上硬件品质问题别指望软件全兜住。5.4 上电后第一次转动方向就是错的典型原因是上一次状态没有初始化或者初始化时引脚还在抖动采样值不对。解决办法是初始化时先延时等引脚稳定后再采样如果还不放心可以连续采样两次两次结果一致才把它当作基线。这个坑特别符合标题里“编码器有空闲状态”的条件旋钮在开机前可能已经被拧到任意角度不能默认上一次状态等于0必须实测。5.5 多个编码器同时接入系统里接多个编码器时每个编码器都要有独立的s_prev_state和s_encoder_delta变量方向表可以共用但状态变量不能共用。有些MCU同一组端口的上拉配置和复用功能会互相影响原理图阶段就要规划好引脚分配最好每个编码器A相都选在不同的外部中断线端口避免中断入口冲突。5.6 排查速查表现象排查方向常见根因解决手段方向反A/B接线、方向表符号接线对调或正方向定义不符接线对调或软件取反静止乱跳静态电压、上拉、RC、清中断标志上拉没开、电容过大、清标志顺序错检查GPIO配置、调整RC、调整清理顺序高速丢步ISR长度、RC、优先级、编码器品质ISR内有打印、电容过大、机械跟不上精简ISR、减小电容、换硬件解码上电首转错初始化采样没有采样基线或采样过早延时稳定后再采样多编码器冲突状态变量、中断资源共用了状态变量每路独立状态变量6. 扩展玩法与个人经验6.1 用硬件定时器正交解码模式不少32位MCU的定时器外设自带编码器接口模式把A、B信号接到定时器的两个输入通道硬件自动对边沿解码计数寄存器自动加减软件只需要读寄存器。这个方案CPU占用更低速度上限也更高在电机闭环和高速手轮场景下很香。但要注意它通常固定占用定时器资源引脚复用也有限制可能和现有PCB布局冲突。标题这个项目要求的是C语言软件实现所以前面都以状态机方案为主硬件解码我就点到为止给你留着一条优化路线。6.2 转速计算与加速度判断在状态机方案的基础上还能扩展出转速计算。做法是在ISR里每次状态变化都记录一次自由运行定时器的计数值主循环用两次跳变之间的时间差换算转速。注意时间戳变量用32位读取高16位和低16位时要关注MCU的“半字”读取问题否则偶尔会算出离谱的时间差。如果只是做方向识别这部分砍掉即可别给自己加负担。6.3 把驱动封装成独立模块建议把方向增量和状态表做成一个独立的C文件业务代码只调用Encoder_GetAndResetDelta()。我当时这么封装之后后面再做类似项目时直接把整个C文件拖过去改一下引脚读取宏编译就能跑。界面刷新、串口打印、掉电保存这些功能全部留在主循环里驱动层保持干净也方便测试。6.4 最后的经验如果状态机、消抖、上拉这些条件都做对了还有个别随机误计数大概率是机械编码器本身触点氧化或者模块供电不稳。换一颗品质好点的编码器或者用稳压芯片给编码器单独供电往往比改半天软件更有效。我个人做下来还有个体会把旋转编码器的数值当成方向增量而不是绝对值来用界面只在变化时响应静止时不做任何操作即使偶尔有一两次毛刺没滤掉用户也不容易感知到错误。这个理念比单纯追求计数绝对准确更贴合真实产品体验。

相关新闻

HarmonyOS实战:算术闯关App串联状态管理、路由与组件生命周期

HarmonyOS实战:算术闯关App串联状态管理、路由与组件生命周期

做了几十个独立的小功能之后,很多人会遇到一个共同的瓶颈:单个知识点都看得懂,但真要组合成一个完整应用,脑子里还是一团浆糊。我身边就有同事卡在“组件会写了,路由也会跳了,状态管理背了一堆概念&#xf…

2026/10/17 5:49:30 阅读更多 →
方向贴图解码原理与跨平台实战避坑指南

方向贴图解码原理与跨平台实战避坑指南

1. 这张“灰蒙蒙”的贴图,到底在告诉引擎什么?第一次在某跨平台渲染项目里看到DecodeDirectionalLightmap这个函数名时,我下意识以为它只是个简单的颜色解码——把压缩过的RGB值还原成线性空间的光照强度。直到某天,场景中一个金属…

2026/10/17 5:49:30 阅读更多 →
斗地主计分器JS实现:状态机驱动的规则建模与防错设计

斗地主计分器JS实现:状态机驱动的规则建模与防错设计

1. 为什么一个斗地主计分器值得花时间手写JS实现“js实现斗地主计分器”——看到这个标题,很多人第一反应是:不就是加减乘除吗?用Excel不就完事了?我最初也这么想。直到去年帮某高校信息学院的棋牌类通识课助教做教学支持时&#…

2026/10/17 5:49:30 阅读更多 →

最新新闻

CST软件案例:加载扼流环的电磁透明基站天线仿真研究

CST软件案例:加载扼流环的电磁透明基站天线仿真研究

无线移动通信最初始于上世纪 50 年代的军事应用,随后关于移动通信蜂窝网概念的提出,加速了其民用化的发展。所以从 1995 年到 2010 年左右,全球无线移动通信行业经历了井喷式的增长。市场竞争推动了计算机软硬件技术的更新换代和互联网技术的…

2026/10/17 6:25:52 阅读更多 →
动态图神经网络:从静态GNN到连续时间建模的架构选型与评估实践

动态图神经网络:从静态GNN到连续时间建模的架构选型与评估实践

1. 动态图为什么让传统图神经网络“失灵”动态图神经网络这个方向,最近两年在学术圈的热度一直往上走。原因不复杂:现实世界里大量关系数据天生就是随时间演化的。社交网络里用户关注关系每分钟都在变,金融交易网络里资金流向按秒更新&#x…

2026/10/17 6:25:52 阅读更多 →
浏览器 3D CAD 免费开源方案:Chili3D 快速上手完整指南

浏览器 3D CAD 免费开源方案:Chili3D 快速上手完整指南

浏览器 3D CAD 免费开源方案:Chili3D 快速上手完整指南 【免费下载链接】chili3d A 3D CAD running entirely in the browser 项目地址: https://gitcode.com/GitHub_Trending/ch/chili3d 想画个零件,却要装一个动辄几 GB 的 CAD 软件&#xff1f…

2026/10/17 6:25:52 阅读更多 →
3种方式拿到Volatility3插件:内存镜像分析实战入门

3种方式拿到Volatility3插件:内存镜像分析实战入门

3种方式拿到Volatility3插件:内存镜像分析实战入门 【免费下载链接】volatility3 Volatility 3.0 development 项目地址: https://gitcode.com/GitHub_Trending/vo/volatility3 Volatility3 是一款面向内存取证的开源框架,它能从内存镜像里还原进…

2026/10/17 6:25:52 阅读更多 →
OfficeCLI: 5 分钟生成 Word、Excel、PPT,无需安装 Office

OfficeCLI: 5 分钟生成 Word、Excel、PPT,无需安装 Office

OfficeCLI: 5 分钟生成 Word、Excel、PPT,无需安装 Office 【免费下载链接】OfficeCLI OfficeCLI is the first and best Office suite purpose-built for AI agents to read, edit, and automate Word, Excel, and PowerPoint files. Free, open-source, single binary, no Of…

2026/10/17 6:25:52 阅读更多 →
Cosmos-H-Dreams 闭环手术策略评估:GR00T-H 策略模型测试完整实战指南

Cosmos-H-Dreams 闭环手术策略评估:GR00T-H 策略模型测试完整实战指南

【免费下载链接】Cosmos-H-Dreams 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Cosmos-H-Dreams 点击查看 免费下载 Cosmos-H-Dreams 是 NVIDIA 开源的实时、动作条件手术世界模型:给它一帧手术场景图像和一条机器人动作流,它就能在…

2026/10/17 6:24:52 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →