STM32 HAL库红外遥控解码:定时器捕获与状态机实战
简介这是一份面向嵌入式初学者与STM32开发者的红外遥控解码实践资源基于HAL库实现红外信号的接收、定时器捕获与串口输出帮助读者理解NEC等红外协议的脉冲解码流程适合作为外设驱动入门与课程设计的参考工程。压缩包共79个文件约545KB以48个h头文件与21个c源文件为核心另含uvprojx、uvoptx工程配置、ioc初始化文件、hex固件及启动汇编等工程结构完整可直接在MDK中打开编译。目前已有3454人学习下载。资源涵盖定时器输入捕获、串口通信、GPIO配置与中断服务等关键模块并附有基于正点原子的说明文档与体积精简脚本便于读者对照源码梳理红外解码逻辑、调试串口打印信息快速搭建可运行的红外遥控接收系统。1. 红外遥控解码为什么总在中断里翻车很多人第一次用 STM32 的 HAL 库做红外遥控接收代码看着简单跑起来却时好时坏按一下遥控器串口打印出来的地址和命令码偶尔对、偶尔错连续按几次干脆死机。问题不在 HAL 库本身而在于红外接收头的输出波形对时序极其敏感而大多数人把解码逻辑直接塞进外部中断回调一进中断就做几十微秒的忙等主循环和其他中断全被拖住。红外遥控器的载波是 38kHz接收头解调后输出的是高低电平脉宽序列NEC 协议里引导码 9ms 低电平加 4.5ms 高电平逻辑 0 是 560μs 低加 560μs 高逻辑 1 是 560μs 低加 1.69ms 高。这些时间量级决定了你不能用 HAL_Delay 在中断里等也不能假设每次边沿都干净。这篇笔记面向已经能点灯、能串口打印、想用 HAL 库把红外遥控做稳的嵌入式开发者从定时器捕获配置讲到状态机解码再到实测波形排错把这条链路一次走通。2. 用定时器输入捕获把红外波形变成时间戳2.1 为什么选输入捕获而不是外部中断加延时外部中断方案的本质问题是你只知道边沿来了不知道两个边沿之间隔了多久。有人用 HAL_GetTick 记时间但 SysTick 是 1ms 分辨率而红外逻辑 0 的高电平只有 560μs根本量不准。输入捕获则让定时器硬件在边沿触发瞬间把计数器值锁存到 CCR 寄存器分辨率取决于定时器时钟。以 72MHz 主频、预分频 71 为例计数频率 1MHz每个计数 1μs560μs 对应 560 个计数1.69ms 对应 1690 个计数区分度足够。常见做法是把接收头输出脚接到带输入捕获通道的 GPIO比如 TIM2_CH1配置为双边沿触发每次捕获都读 CCR 并清零计数器两次捕获值之差就是脉宽。选型上要注意不是所有定时器通道都支持双边沿捕获。STM32 的输入捕获一般配合从模式复位或 PWM 输入模式使用。PWM 输入模式能自动测量周期和占空比但红外协议里高低电平交替且长度不一PWM 输入模式反而不好用。我一般用单通道双边沿捕获加软件状态机灵活且容易调试。2.2 CubeMX 里定时器捕获的关键参数在 CubeMX 中配置 TIM2Clock Source 选 Internal ClockChannel1 选 Input Capture direct mode。Prescaler 设为 71Counter Period 设为 65535这样计数器溢出周期约 65.5ms足够覆盖一帧红外数据NEC 一帧约 67.5ms接近但通常不会整帧超时因为引导码后数据段远小于此。Capture 配置里IC1 的 Polarity 选 Rising Edge 先启动后续在代码里动态切换。NVIC 里使能 TIM2 全局中断。GPIO 方面接收头输出脚接 PA0配置为上拉输入或浮空输入具体看接收头输出类型多数一体化接收头输出为集电极开路需要外部上拉或内部上拉。这里有个容易忽略的点CubeMX 生成的捕获初始化只设了一个边沿。双边沿切换要在捕获回调里手动改 CCR 的极性位。HAL 库提供了__HAL_TIM_SET_CAPTUREPOLARITY宏但调用它之前要先关闭捕获通道否则可能产生虚假捕获。血泪经验是切换极性时先HAL_TIM_IC_Stop_IT改完再HAL_TIM_IC_Start_IT多这两行能省掉大量玄学丢帧。2.3 捕获回调里只做一件事记录时间差下面是最小可用的捕获回调骨架逻辑是每次捕获算出差值存入一个环形缓冲区主循环再去做协议解析。中断里绝不做判断协议的事。// tim.c 中由 CubeMX 生成的捕获回调 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM2 htim-Channel HAL_TIM_ACTIVE_CHANNEL_1) { // 读取当前捕获值并立即清零计数器保证下次捕获是相对时间 uint32_t capture HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); __HAL_TIM_SET_COUNTER(htim, 0); // 存入环形缓冲区只存时间差不解析 ir_edge_buf[ir_edge_wr] capture; ir_edge_wr (ir_edge_wr 1) % IR_EDGE_BUF_SIZE; // 切换极性准备捕获下一个边沿 HAL_TIM_IC_Stop_IT(htim, TIM_CHANNEL_1); if (current_polarity RISING) { __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); current_polarity FALLING; } else { __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); current_polarity RISING; } HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1); } }这段代码的关键参数是IR_EDGE_BUF_SIZE我一般取 128因为 NEC 一帧最多 68 个边沿引导码 2 个加 32 位数据各 2 个边沿留一倍余量。__HAL_TIM_SET_COUNTER(htim, 0)放在读取之后保证每次捕获值就是距上一个边沿的微秒数。极性切换用current_polarity变量跟踪避免读寄存器判断。注意HAL_TIM_IC_Stop_IT和Start_IT之间有极短窗口但红外边沿间隔最小 560μs远大于这几条指令的执行时间不会丢边沿。3. 状态机解码把边沿序列翻译成地址和命令码3.1 NEC 协议的时序判定阈值怎么定拿到一串脉宽后要判定每个是引导码、逻辑 0 还是逻辑 1。NEC 标准里引导码低电平 9ms、高电平 4.5ms逻辑 0 低 560μs、高 560μs逻辑 1 低 560μs、高 1.69ms。实际接收头输出会有抖动不能精确相等。我一般用区间判定低电平在 8ms 到 10ms 之间算引导码低高电平在 4ms 到 5ms 之间算引导码高低电平在 400μs 到 800μs 之间算数据位低高电平在 400μs 到 800μs 之间算逻辑 0在 1.2ms 到 2.0ms 之间算逻辑 1。超出这些区间的边沿直接丢弃并复位状态机避免噪声累积。这些阈值不是拍脑袋是拿逻辑分析仪抓了几十帧实际波形后取的覆盖范围。不同品牌接收头如 1838 系列输出脉宽略有差异但都在这个区间内。如果你的遥控器是其他协议比如 RC5 或 SIRC阈值要重新定但状态机框架不变。3.2 一个可复用的解码状态机实现状态机在主循环里跑从环形缓冲区取边沿时间差按顺序推进。下面是一个针对 NEC 的简化实现只处理一帧 32 位数据。typedef enum { IR_IDLE, // 等待引导码低电平 IR_LEAD_HIGH, // 已收到引导码低等引导码高 IR_DATA, // 接收 32 位数据 IR_DONE // 一帧完成 } ir_state_t; void ir_decode_task(void) { static ir_state_t state IR_IDLE; static uint32_t bit_count 0; static uint32_t data 0; while (ir_edge_rd ! ir_edge_wr) // 缓冲区有数据 { uint32_t width ir_edge_buf[ir_edge_rd]; ir_edge_rd (ir_edge_rd 1) % IR_EDGE_BUF_SIZE; switch (state) { case IR_IDLE: // 引导码低电平 9ms 左右 if (width 8000 width 10000) state IR_LEAD_HIGH; break; case IR_LEAD_HIGH: // 引导码高电平 4.5ms 左右 if (width 4000 width 5000) { state IR_DATA; bit_count 0; data 0; } else state IR_IDLE; // 引导码不完整复位 break; case IR_DATA: // 数据位低电平固定约 560us高电平决定 0 或 1 // 这里 width 是低电平先跳过等下一个高电平 // 为简化假设缓冲区里低高成对出现实际要按边沿顺序处理 if (width 400 width 800) { // 这是数据位低电平继续等高电平 // 真实实现里需要再取一个边沿判断高电平长度 } else if (width 400 width 800) { // 逻辑 0 data data 1; // NEC 低位先发右移 bit_count; } else if (width 1200 width 2000) { // 逻辑 1 data (data 1) | 0x80000000; bit_count; } else { state IR_IDLE; // 时序异常复位 break; } if (bit_count 32) { state IR_DONE; } break; case IR_DONE: // 解析出地址和命令地址是低 16 位命令是高 16 位 ir_addr data 0xFFFF; ir_cmd (data 16) 0xFF; ir_ready 1; // 通知应用层 state IR_IDLE; break; } } }上面这段代码为了展示状态机结构做了简化实际处理数据位时要把低电平和高电平成对消费。更稳妥的做法是在IR_DATA状态里维护一个expect_low标志先收低电平确认在 400 到 800μs再收高电平判 0 或 1。参数上data用 32 位存一帧NEC 是地址 8 位、地址反码 8 位、命令 8 位、命令反码 8 位共 32 位。地址和命令的反码可以用来校验如果反码不匹配说明解码出错直接丢弃。这个校验能过滤掉大部分偶发误码。3.3 主循环与中断的分工边界中断只负责记录边沿时间戳主循环负责状态机推进和协议解析这是整个方案稳定的核心。有人会问主循环如果被其他任务阻塞缓冲区会不会溢出128 个边沿的缓冲区按 NEC 一帧 68 个边沿算能存近两帧。只要主循环在 100ms 内至少跑一次ir_decode_task就不会溢出。如果你的应用里有长时间阻塞操作要么加大缓冲区要么把解码任务放到定时器中断里以固定周期调用但不要在捕获中断里做解码。我一般会在主循环里用if (ir_ready)判断是否有新帧然后处理按键逻辑。ir_ready在解码完成后置 1应用层处理完清零。这样中断、解码、应用三层解耦调试时哪一层出问题一目了然。4. 避坑与排查红外接收最常见的五个翻车点4.1 接收头输出一直是高电平捕获中断不触发现象示波器看接收头输出脚始终是高按遥控器也没变化。原因通常是接收头供电或接地问题或者输出脚接错了 GPIO。一体化接收头一般三脚VCC、GND、OUT正面凸起对应 OUT。先量 VCC 是不是 3.3V 或 5V看型号再确认 OUT 是否接到了配置为输入捕获的引脚。如果供电正常但无输出可能是接收头损坏换一个试。还有一种情况是遥控器电池没电红外发射管不亮用手机摄像头对着遥控器发射管按按键能看到紫光说明遥控器正常。4.2 能触发中断但解码全是乱码现象串口打印的地址和命令每次都不一样或者固定但明显不对。原因多半是定时器计数频率不对。检查 CubeMX 里 Prescaler 和主频是否匹配比如主频 72MHz、Prescaler 71 得到 1MHz如果主频是 64MHz 而 Prescaler 还是 71计数频率就变成 0.9MHz所有时间判定都会偏。另一个原因是捕获极性切换没生效导致只捕获上升沿或只捕获下降沿时间差全是半个周期。用调试器在捕获回调里打断点看每次进中断时current_polarity是否在交替。4.3 短按正常长按或连续按就死机现象按一下能解出正确码按住不放或快速连按几次程序卡死或复位。原因是中断里做了耗时操作或者缓冲区溢出后读写指针越界。检查捕获回调里有没有调用HAL_Delay或浮点运算这些都要挪到主循环。缓冲区读写用取模运算确保ir_edge_wr和ir_edge_rd不会超出数组范围。如果长按导致重复码NEC 重复码是 9ms 低加 2.25ms 高加 560μs 低状态机要能识别并跳过否则会把重复码当数据位解析累积错误。4.4 解码正确但偶尔多一位或少一位现象大部分帧正确偶尔地址或命令错一位。原因是边沿抖动导致某个边沿被重复捕获或漏掉。接收头输出在电平跳变时可能有毛刺尤其是低电平到高电平的上升沿。解决办法是在 GPIO 初始化时配置输入滤波或者用定时器的输入捕获滤波器IC Filter。在 CubeMX 的 Capture 配置里有 Input Filter 选项选 4 到 8 个采样周期能滤掉窄脉冲。另外状态机里对每个时间差做区间判定超出范围直接复位不要试图容错容错反而会累积错误。4.5 不同遥控器解码结果不一致现象同一个接收头遥控器 A 能解遥控器 B 解不出或解错。原因是不同遥控器可能用不同协议或者同一协议但载波频率、时序有差异。NEC 协议最常见但有些遥控器用 RC5曼彻斯特编码、SIRC索尼、或 NEC 扩展版本。先用逻辑分析仪抓一帧波形看引导码和数据位时序对照协议手册判断。如果确认是 NEC 但时序偏差大把判定区间放宽比如逻辑 1 的高电平从 1.2ms 到 2.0ms 放宽到 1.0ms 到 2.2ms。但放宽会增加误判概率要配合反码校验一起用。5. 用重复码和反码校验把稳定性再提一档5.1 识别 NEC 重复码支持长按连续触发NEC 协议里按住遥控器按键不放发射的不是完整帧而是重复码9ms 低电平、2.25ms 高电平、560μs 低电平然后停止。重复码没有地址和命令只表示“上一个键还按着”。很多初学者代码不处理重复码导致长按时状态机把 2.25ms 高电平当成逻辑 1 或异常值解码错乱。正确做法是在状态机里加一个IR_REPEAT状态当收到 9ms 低电平后如果下一个高电平在 2.0ms 到 2.5ms 之间就判定为重复码直接触发上一次的按键事件不更新地址和命令。实现上在IR_IDLE状态收到 9ms 低电平后不直接进IR_LEAD_HIGH而是先判断下一个边沿。如果高电平在 4ms 到 5ms是完整帧引导码如果在 2.0ms 到 2.5ms是重复码。这需要在状态机里多一个分支。重复码的按键事件可以设置一个标志应用层根据这个标志决定是单击还是长按。我一般用重复码计数来实现长按加速第一次重复码触发单击后续每收到一个重复码如果间隔小于 200ms就加速触发。5.2 反码校验一行代码过滤八成误码NEC 一帧 32 位里地址低 8 位和地址高 8 位是反码关系命令低 8 位和命令高 8 位也是反码关系。解码出 32 位后做两次校验uint8_t addr_low data 0xFF; uint8_t addr_high (data 8) 0xFF; uint8_t cmd_low (data 16) 0xFF; uint8_t cmd_high (data 24) 0xFF; if ((addr_low ^ addr_high) ! 0xFF || (cmd_low ^ cmd_high) ! 0xFF) { // 校验失败丢弃这一帧 return; } // 校验通过addr_low 和 cmd_low 就是有效地址和命令这段校验逻辑极简单但能过滤掉大部分因边沿抖动或时序偏差导致的误码。因为误码通常只影响个别位反码关系被破坏的概率很高。加上校验后实测误码率从每几十帧一次降到几百帧一次。如果校验失败率很高说明时序判定阈值需要调整或者接收头输出质量差考虑换接收头或加硬件滤波。5.3 用串口打印原始边沿做离线分析调试红外最有效的手段不是猜是把原始边沿时间打印出来看。在捕获回调里把每个capture值通过串口发出格式用逗号分隔波特率 115200。按一次遥控器串口助手会收到一串数字复制到文本文件用脚本或 Excel 分析。正常的 NEC 帧应该是9000, 4500, 560, 560, 560, 1690, ... 这样的序列。如果看到 9000 后面跟的不是 4500 而是 2000 多说明是重复码。如果看到大量 100 以下的数值说明有毛刺需要开输入滤波。串口打印本身会占用时间在中断里直接打印可能影响捕获。我一般用 DMA 把边沿数据搬到串口发送缓冲区或者先在内存里存一帧主循环再打印。如果只是调试可以在捕获回调里只存数组主循环检测到一帧结束后统一打印。这样既能看到原始数据又不破坏实时性。5.4 把解码结果映射到具体按键解码出地址和命令后最后一步是映射到应用逻辑。地址用来区分不同遥控器或不同设备命令对应具体按键。我一般用一个结构体数组做映射表typedef struct { uint8_t addr; uint8_t cmd; uint8_t key_id; } ir_key_map_t; const ir_key_map_t key_map[] { {0x00, 0x45, KEY_POWER}, {0x00, 0x46, KEY_MENU}, {0x00, 0x47, KEY_UP}, // ... 其他按键 }; uint8_t ir_lookup_key(uint8_t addr, uint8_t cmd) { for (int i 0; i sizeof(key_map)/sizeof(key_map[0]); i) { if (key_map[i].addr addr key_map[i].cmd cmd) return key_map[i].key_id; } return KEY_NONE; }映射表的好处是换遥控器或改按键功能时只改表不动解码逻辑。地址和命令的具体值用串口打印确认后填入。如果遥控器地址固定可以只匹配命令地址做通配。注意不同遥控器的地址可能相同如果同时用多个遥控器地址和命令要一起匹配。5.5 一个我常用的验证习惯每次改完解码参数我不会直接跑应用而是先做一个最小验证串口打印每一帧的原始 32 位数据、校验结果、映射后的按键 ID。连续按 50 次同一个键看是否 50 次都一致。再快速按不同键看是否串键。最后按住不放 10 秒看重复码是否稳定触发。这三步过了再接入实际业务逻辑。这个习惯帮我省了很多后悔药因为红外问题一旦混入业务代码排查成本翻倍。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于Web的PS5辅助管理工具:架构设计与多主机数据聚合实践

基于Web的PS5辅助管理工具:架构设计与多主机数据聚合实践

不知道从什么时候开始,主机玩家的"资产"越来越数字化了。过去是货架上一排排光碟,现在是游戏库里的几百个图标、动不动就爆的固态硬盘、以及每次开机都要等半天的下载队列。我自己就是典型的重度PS5玩家,游戏买了不少,真…

2026/10/14 9:05:48 阅读更多 →
Python数字图案打印:循环结构与格式化输出实践

Python数字图案打印:循环结构与格式化输出实践

1. 项目背景与需求解析 数字图案打印是编程初学者常见的练习题型,也是培养逻辑思维能力的绝佳途径。这道B4067题目要求我们根据输入的数字n,打印出特定的数字图案。这类题目看似简单,实则蕴含了多重编程思维训练价值。 从教学角度来看&#…

2026/10/14 9:05:48 阅读更多 →
微信小程序点餐系统开发与优化实践

微信小程序点餐系统开发与优化实践

1. 项目背景与核心价值在餐饮行业数字化转型的大趋势下,咖啡店这类高频消费场景对点餐效率的要求越来越高。传统纸质菜单人工点单的模式存在三个痛点:高峰期排队时间长、人工记录易出错、会员营销难触达。我们团队开发的这套微信小程序点餐系统&#xff…

2026/10/14 9:04:46 阅读更多 →

最新新闻

Node.js+Vue全栈开发出租车智能调度系统实践

Node.js+Vue全栈开发出租车智能调度系统实践

1. 项目背景与核心需求出租车业务管理系统是传统运输行业数字化转型的典型场景。随着网约车平台的兴起,传统出租车公司面临着运营效率低下、调度方式落后、数据统计困难等痛点。这个基于Node.jsVue的全栈项目,正是为了解决以下核心问题:实时调…

2026/10/14 10:08:38 阅读更多 →
瑞利-里茨法:弹性力学能量原理与工程实践

瑞利-里茨法:弹性力学能量原理与工程实践

1. 瑞利-里茨法基础理论1.1 能量原理的物理背景在弹性力学系统中,能量原理为我们提供了一种强有力的分析工具。最小势能原理指出:在所有满足位移边界条件的可能位移场中,真实的位移场使得系统的总势能取得极小值。这个原理不仅适用于静力学问…

2026/10/14 10:08:38 阅读更多 →
Kafka Log存储原理:揭秘顺序写、稀疏索引与Segment分片设计

Kafka Log存储原理:揭秘顺序写、稀疏索引与Segment分片设计

1. 这不是“日志存储”,而是 Kafka 的数据心脏——从磁盘文件结构看吞吐与一致性的底层博弈你打开 Kafka 的 data 目录,看到一堆形如topic-partition-0/00000000000000000000.log和00000000000000000000.index的文件,第一反应可能是&#xff…

2026/10/14 10:08:38 阅读更多 →
Qt+MinGW 编译 PCL 全依赖链实战指南

Qt+MinGW 编译 PCL 全依赖链实战指南

简介:本资源面向需要在Windows平台使用Qt与MinGW构建点云处理环境的C开发者,提供PCL及其全部依赖库的完整编译成果。PCL是开源三维点云处理库,涵盖数据采集、预处理、特征提取与表面重建;配套的Boost、Eigen、FLANN、Qhull与VTK分…

2026/10/14 10:08:38 阅读更多 →
基于机器学习的Web日志异常检测与根因分析

基于机器学习的Web日志异常检测与根因分析

简介:这是一套面向Web安全工程师、运维开发人员及机器学习初学者的终端日志分析工具,聚焦于Web服务器日志的自动化统计、审计与恶意请求识别。项目基于Python实现,集成日志解析、访问量/请求类型多维统计、SQLite(或MySQL&#xf…

2026/10/14 10:08:38 阅读更多 →
macOS C++20开发环境配置:LLVM+VS Code+Clang完整闭环

macOS C++20开发环境配置:LLVM+VS Code+Clang完整闭环

1. 为什么 macOS 上配 C 环境总让人“卡在第一步”?Mac 用着顺手,写代码也清爽,但一到配 C 环境,很多人就停在了终端里那行command not found: g上——不是没装 Xcode,就是装了却找不到编译器路径;不是clan…

2026/10/14 10:07:26 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →