STM32红外遥控解码实战:从NEC协议到状态机设计
1. 从“万能遥控器”到嵌入式感知红外遥控的工程价值你手边是不是总有几个闲置的遥控器电视的、空调的、机顶盒的它们躺在抽屉里除了偶尔按一下似乎没什么存在感。但如果你手里有一块STM32开发板这些不起眼的红外遥控器瞬间就能变成一个绝佳的“输入设备”和“通信模块”学习入口。红外遥控这个听起来有点“古老”的技术恰恰是嵌入式开发中一个极佳的练手项目。它麻雀虽小五脏俱全涉及GPIO输入捕获、外部中断、定时器精准计时、协议解码、状态机设计甚至还能延伸到简单的无线通信概念。通过解码一个遥控器你不仅能控制一个LED的亮灭更能理解一套完整的、从物理信号到逻辑指令的数据链路是如何被打通和解析的。这远比单纯点个灯、读个温度传感器要来得系统。今天我们就以STM32为平台彻底拆解红外遥控从硬件连接到协议分析再到代码实现与调试手把手带你把这个“黑盒子”变成你项目里听话的“遥控指挥官”。2. 红外遥控系统的硬件拼图不只是接收头那么简单很多人拿到红外接收头比如常见的HS0038、VS1838直接往板子上一插就开始写代码结果发现要么收不到数据要么数据全是乱的。问题往往出在第一步——对硬件系统的理解不够完整。一个完整的红外遥控系统是发射端与接收端的协同。2.1 发射端遥控器的“语言”编码我们手里的遥控器其核心是一个红外发射二极管。当你按下按键时遥控器内部的编码芯片通常是定制ASIC会生成一组特定的数字脉冲序列并用一个约38kHz的载波进行调制。为什么要调制目的是为了提高抗干扰能力。环境中有大量的红外噪声如日光灯、白炽灯如果不加调制接收端很难从噪声中分辨出有效信号。38kHz的载波就像给数据穿上了“制服”接收头只认这个频率的信号。常见的编码协议有NEC、RC-5、RC-6、Sony SIRC等。其中NEC协议因其简单和普及成为我们学习的首选。它的一个完整帧包括引导码、用户码、用户反码、按键码、按键反码。反码用于校验提高可靠性。引导码是一个9ms的低电平和4.5ms的高电平用来告诉接收头“注意数据要来了”2.2 接收端HS0038的“翻译”工作红外接收头如HS0038是一个集成化的模块它内部包含了光电二极管、前置放大器、带通滤波器和解调电路。它的任务很明确只接收中心频率为38kHz的红外信号并将其解调还原出发射端送出的原始数字脉冲序列即基带信号然后通过OUT引脚输出给MCU。这里有几个关键硬件连接细节供电与接地务必稳定。VCC通常接3.3V或5V查看数据手册GND必须可靠接地。电源噪声会导致接收异常。OUT引脚连接连接到STM32的任何一个GPIO口但强烈建议选择具有外部中断和定时器输入捕获功能的引脚。因为解码的核心是测量脉冲宽度用中断定时器是最精准高效的方式。上拉电阻大部分接收头OUT引脚内部已有上拉但为了稳定可以在外部再接一个4.7kΩ - 10kΩ的上拉电阻到VCC确保空闲时为高电平。布局与滤波接收头应远离MCU的晶振、数字开关电源等噪声源。在VCC和GND引脚附近并联一个10uF的电解电容和一个0.1uF的瓷片电容进行滤波能极大改善接收稳定性。注意接收头输出的信号是反向的。即当收到38kHz载波时OUT输出低电平无载波时输出高电平。所以我们在示波器上看到的是一个低电平有效的信号。这一点在解码逻辑中至关重要。3. NEC协议解码的核心定时器与状态机的精准舞蹈理解了硬件信号接下来就是如何用STM32的软件“听懂”这种语言。核心武器是定时器TIM和有限状态机FSM。3.1 定时器配置捕获时间的尺子我们需要一把高精度的“尺子”来测量每一个脉冲高电平或低电平的宽度。STM32的通用定时器如TIM2, TIM3, TIM4的输入捕获功能完美胜任。配置步骤如下定时器时钟初始化将定时器时钟源设为内部时钟预分频系数PSC设置为系统时钟频率 / 1MHz - 1。这样计数器每计数一次代表1微秒us方便我们直接读取时间值。例如72MHz系统时钟PSC设为71。自动重装载值ARR设为最大值如0xFFFF因为我们只关心脉冲间的相对时间差。输入捕获通道配置将连接接收头OUT的GPIO引脚配置为对应定时器的输入捕获通道如TIMx_CHx。模式设置为“上升沿和下降沿捕获”这样任何一个边沿变化都会触发中断。中断使能开启定时器的捕获/比较中断TIM_IT_CCx和更新中断可选。3.2 状态机设计解码的逻辑骨架NEC协议的数据帧是串行的我们必须按顺序识别出引导码、用户码、数据码。一个清晰的状态机让代码逻辑一目了然。我们可以定义以下几个状态typedef enum { IR_IDLE, // 空闲状态等待引导码 IR_LEADER_CODE, // 已检测到引导码起始沿等待引导码结束 IR_DATA, // 正在接收数据位 IR_REPEAT, // 重复码检测长按按键 IR_FINISHED // 一帧数据接收完成 } IR_State_t;解码流程的状态迁移如下IR_IDLE持续监测。当捕获到下降沿因为信号反向物理引导码起始9ms低电平对应OUT上升沿但我们通常监测下降沿更简单时记录当前定时器计数T1。这是一个可能的引导码开始。IR_LEADER_CODE在中断中等待下一个上升沿引导码结束。记录时间T2。计算脉宽T2 - T1。如果脉宽在8.5ms ~ 9.5ms低电平和4.0ms ~ 5.0ms随后的高电平范围内则确认是引导码状态跳转到IR_DATA并初始化数据位索引和存储变量。IR_DATA此后每一个下降沿代表一位数据的开始。记录时间T_start。等待下一个上升沿记录时间T_end。计算高电平脉宽T_end - T_start。如果脉宽约为560us则判定为逻辑‘0’。如果脉宽约为1.69ms则判定为逻辑‘1’。将判断出的位数据存入缓冲区。接收完32位或16位根据协议变种后状态跳转到IR_FINISHED。IR_FINISHED进行校验用户码与用户反码是否互补按键码与按键反码是否互补。校验通过则解码成功将有效的用户码和按键码存入全局变量供主循环查询。状态重置为IR_IDLE。IR_REPEATNEC协议中长按按键时发送完一帧完整数据后会每隔约110ms发送一个特殊的重复码9ms低电平2.25ms高电平560us低电平。我们需要单独识别这个模式以实现长按连续触发功能。实操心得定时器的计数器是循环计数的溢出后从0开始。在计算时间差时必须考虑计数器溢出的情况。使用(uint16_t)(T_end - T_start)的方式计算即使发生一次溢出只要两次捕获间隔小于计数器周期结果仍是正确的。这是嵌入式时间测量中的经典技巧。4. 代码实现与调试从逻辑到现实的跨越理论清晰后我们用代码将其实现。这里以STM32 HAL库为例展示核心代码片段和调试技巧。4.1 GPIO与定时器初始化首先进行硬件初始化。// infrared.c void IR_Receiver_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; TIM_HandleTypeDef htimx; TIM_IC_InitTypeDef sConfigIC {0}; // 1. 使能时钟 __HAL_RCC_GPIOx_CLK_ENABLE(); __HAL_RCC_TIMx_CLK_ENABLE(); // 2. 配置GPIO为复用功能上拉 GPIO_InitStruct.Pin IR_IN_PIN; GPIO_InitStruct.Mode GPIO_MODE_AF_INPUT; GPIO_InitStruct.Pull GPIO_PULLUP; HAL_GPIO_Init(IR_IN_PORT, GPIO_InitStruct); // 3. 配置定时器基础1us计数 htimx.Instance TIMx; htimx.Init.Prescaler 71; // 72MHz / (711) 1MHz htimx.Init.CounterMode TIM_COUNTERMODE_UP; htimx.Init.Period 0xFFFF; htimx.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_IC_Init(htimx); // 4. 配置输入捕获通道双边沿触发 sConfigIC.ICPolarity TIM_ICPOLARITY_BOTHEDGE; sConfigIC.ICSelection TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler TIM_ICPSC_DIV1; sConfigIC.ICFilter 0x00; // 不滤波或根据噪声情况设置 HAL_TIM_IC_ConfigChannel(htimx, sConfigIC, TIM_CHANNEL_x); // 5. 启动捕获并开启中断 HAL_TIM_IC_Start_IT(htimx, TIM_CHANNEL_x); HAL_NVIC_SetPriority(TIMx_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIMx_IRQn); }4.2 中断服务程序与状态机实现这是解码的核心在定时器的捕获中断回调函数中实现状态机。// infrared.c volatile IR_State_t ir_state IR_IDLE; volatile uint32_t ir_raw_data 0; volatile uint8_t ir_data_bit_idx 0; volatile uint8_t ir_repeat_flag 0; volatile uint16_t ir_last_capture 0; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { uint16_t curr_capture HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_x); uint16_t pulse_width; // 计算脉冲宽度处理计数器溢出 pulse_width (curr_capture ir_last_capture) ? (curr_capture - ir_last_capture) : (0xFFFF - ir_last_capture curr_capture 1); switch (ir_state) { case IR_IDLE: // 检测到下降沿可能是引导码或重复码开始 if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CCx) ! RESET) { if (pulse_width 8000 pulse_width 10000) { // ~9ms 低电平 ir_state IR_LEADER_CODE; } else if (pulse_width 2000 pulse_width 2500) { // ~2.25ms 重复码高电平 ir_state IR_REPEAT; } } break; case IR_LEADER_CODE: // 检测到上升沿引导码结束 if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CCx) ! RESET) { if (pulse_width 4000 pulse_width 5000) { // ~4.5ms 高电平 // 引导码确认准备接收数据 ir_state IR_DATA; ir_raw_data 0; ir_data_bit_idx 0; } else { // 不是合法的引导码回到空闲 ir_state IR_IDLE; } } break; case IR_DATA: // 每一位数据下降沿是开始上升沿是结束并判断逻辑值 if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CCx) ! RESET) { // 上升沿位结束 if (pulse_width 400 pulse_width 700) { // 逻辑‘0’ // 不左移因为先收到的是LSB } else if (pulse_width 1500 pulse_width 1800) { // 逻辑‘1’ ir_raw_data | (1UL ir_data_bit_idx); } else { // 脉宽异常数据错误重置 ir_state IR_IDLE; break; } ir_data_bit_idx; if (ir_data_bit_idx 32) { // NEC标准为32位 ir_state IR_FINISHED; } } // 下降沿在IDLE或LEADER状态已处理此处只需记录时间逻辑在上升沿判断 break; case IR_REPEAT: // 重复码处理检测到后续的560us低电平后置位重复标志 if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CCx) ! RESET) { if (pulse_width 400 pulse_width 700) { ir_repeat_flag 1; } ir_state IR_IDLE; } break; case IR_FINISHED: // 一帧接收完成状态机在主循环中处理校验和状态重置 break; default: ir_state IR_IDLE; break; } ir_last_capture curr_capture; __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CCx); }4.3 主循环中的数据处理中断只负责收集原始脉冲宽度和状态迁移繁重的校验和数据处理放在主循环避免中断阻塞。// main.c uint8_t ir_user_code 0; uint8_t ir_key_code 0; while (1) { if (ir_state IR_FINISHED) { // 提取数据假设raw_data低32位为接收到的数据 uint8_t user_code (ir_raw_data 24) 0xFF; uint8_t user_code_inv (ir_raw_data 16) 0xFF; uint8_t key_code (ir_raw_data 8) 0xFF; uint8_t key_code_inv ir_raw_data 0xFF; // NEC协议校验原码与反码按位取反后应相等 if (((uint8_t)(~user_code_inv) user_code) ((uint8_t)(~key_code_inv) key_code)) { ir_user_code user_code; ir_key_code key_code; printf(解码成功用户码: 0x%02X, 按键码: 0x%02X\n, user_code, key_code); // 根据按键码执行相应操作 switch (key_code) { case 0x45: HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); break; // 示例按键1控制LED // ... 其他按键处理 default: break; } } else { printf(校验失败\n); } // 处理完成状态重置 ir_state IR_IDLE; } if (ir_repeat_flag) { printf(重复键按下\n); // 执行重复按键动作如持续增加/减少数值 ir_repeat_flag 0; } // ... 其他任务 }5. 实战调试与排坑指南让信号无处可逃代码写好了但很可能第一次上电什么都没收到。别急按以下步骤系统化排查。5.1 硬件诊断确保物理链路畅通供电检查用万用表测量接收头VCC和GND之间的电压确保在额定范围内如5V±0.25V。电压不稳是头号杀手。信号探测最直观的方法是用示波器。将探头接在接收头的OUT引脚和GND之间。无按键时应该是一条稳定的高电平线约VCC电压可能有微小毛刺。按下遥控器按键你应该能看到一串清晰的、高低变化的脉冲波形。如果看不到可能是遥控器没电、接收头损坏、或接收头方向不对红外接收有方向性。观察引导码放大时间轴你应该能清晰看到约9ms的低电平和4.5ms的高电平。这是协议解码的“锚点”。5.2 软件逻辑调试从波形到数据如果硬件波形正常但代码解不出数据问题就在软件。打印脉冲宽度在中断回调函数最开始将计算出的pulse_width通过串口打印出来。按下按键观察输出。你应该能看到一系列有规律的数字大约900045005605601690... 对应引导码和后续的数据位。如果数字杂乱无章或明显不对说明定时器配置预分频PSC有误或者中断处理中时间差计算没考虑溢出。状态机跟踪在状态机每个case的入口和出口打印状态变量。观察状态迁移是否符合预期IDLE - LEADER_CODE - DATA - FINISHED。如果卡在某个状态说明该状态的判断条件脉宽范围设置得太严格或太宽松需要调整阈值。阈值微调协议中的9ms、4.5ms、560us、1690us是理论值。实际中不同遥控器、不同接收头、环境干扰都会造成偏差。你需要根据打印出的实际脉宽适当放宽判断条件。例如引导码低电平判断可以设为if (pulse_width 8000 pulse_width 10000)。抗干扰处理环境光干扰可能导致误触发。可以采取两种措施硬件滤波增加接收头前的遮光罩如热缩管或调整接收头方向避开强光直射。软件滤波在GPIO初始化时启用内部弱上拉/下拉。或者在中断中对于极短200us的脉冲直接忽略这很可能是噪声。5.3 进阶优化与功能扩展当基础解码稳定后可以考虑以下优化低功耗设计如果设备是电池供电可以让红外解码部分在大部分时间休眠仅由接收头OUT引脚的电平变化触发外部中断来唤醒MCU。在中断服务例程中快速完成解码后再次进入休眠。多协议兼容你的代码目前只针对NEC协议。可以抽象出一个协议层定义统一的解码接口。然后为RC-5、Sony等协议实现不同的解码器根据引导码特征自动选择协议。红外发射学习让STM32不仅会收还会发。利用一个红外发射管和另一个定时器PWM模式生成38kHz载波并按照NEC协议格式调制数据发出。这样你就可以制作一个“学习型遥控器”或实现设备间的红外通信。应用集成将解码出的按键码映射为具体的功能命令。例如结合OLED屏幕做一个红外遥控菜单系统或者用遥控器控制一个步进电机、舵机云台。这能将学习成果快速转化为有趣的项目。红外遥控解码是一个典型的“信号采集-协议解析-应用响应”嵌入式系统案例。它涉及硬件接口、定时器精确定时、中断服务、状态机软件设计等多个核心知识点。通过这个项目你收获的不仅仅是如何控制一个设备更是一套处理异步串行数字通信的通用方法论。下次当你再拿起电视遥控器你看到的将不再是一个黑盒子而是一串在空气中飞舞的、由精密定时脉冲构成的数字指令集。

相关新闻

技术深度解析:Goldberg Steam Emulator实现原理与局域网联机实战

技术深度解析:Goldberg Steam Emulator实现原理与局域网联机实战

技术深度解析:Goldberg Steam Emulator实现原理与局域网联机实战 【免费下载链接】SteamEmulator MIRROR REPO - Credits : Mr. Goldberg. Steam emulator that emulates Steam online features. Lets you play games that use the Steam multiplayer APIs on a LAN…

2026/8/6 12:52:14 阅读更多 →
淄博周村网站建设报价多少钱?揭秘本地企业建站真实成本与避坑指南

淄博周村网站建设报价多少钱?揭秘本地企业建站真实成本与避坑指南

大家好,我是你们的老朋友,一个在淄博周村摸爬滚打多年、对互联网行业有着近乎偏执热爱的从业者。今天不聊虚的,咱们直接切入正题,聊聊那个让无数周村本地老板、创业达人甚至行政小白都头疼不已的问题——淄博周村网站建设报价。说实话,每次听到有人问“做网站多少钱”,我…

2026/8/6 12:52:14 阅读更多 →
LVDS技术深度解析:从差分信号原理到FPGA高速接口实战

LVDS技术深度解析:从差分信号原理到FPGA高速接口实战

1. 项目概述:LVDS,高速数字世界的“静默引擎” 在数字电路和高速数据传输领域,工程师们总是在追求一个看似矛盾的平衡:如何在有限的功耗和物理空间内,实现越来越高的数据吞吐率,同时还要保证信号在复杂电磁…

2026/8/6 12:52:14 阅读更多 →

最新新闻

技术突破:ComfyUI-Manager实现企业级AI绘画工作流自动化管理

技术突破:ComfyUI-Manager实现企业级AI绘画工作流自动化管理

技术突破:ComfyUI-Manager实现企业级AI绘画工作流自动化管理 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various…

2026/8/6 18:05:46 阅读更多 →
D2DX暗黑破坏神2高清补丁:3步实现60fps宽屏的终极指南

D2DX暗黑破坏神2高清补丁:3步实现60fps宽屏的终极指南

D2DX暗黑破坏神2高清补丁:3步实现60fps宽屏的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 还在忍受暗…

2026/8/6 18:05:46 阅读更多 →
Web Security Academy 第六关: Oracle 数据库 SQL 注入实战详解

Web Security Academy 第六关: Oracle 数据库 SQL 注入实战详解

前言SQL 联合查询注入是渗透测试中最常见的注入手段之一,但不同数据库的语法、系统视图存在明显区别,不能一套 Payload 通吃所有环境。上一篇文章我们完成了 PostgreSQL 靶场的注入实操,本篇带来同系列 Oracle 数据库专项靶场,场景…

2026/8/6 18:05:46 阅读更多 →
浏览器音乐解锁终极指南:如何免费恢复被加密的音乐文件所有权

浏览器音乐解锁终极指南:如何免费恢复被加密的音乐文件所有权

浏览器音乐解锁终极指南:如何免费恢复被加密的音乐文件所有权 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址…

2026/8/6 18:05:46 阅读更多 →
别只看最终答案:多模态 RAG 需要一套文档解析评测包

别只看最终答案:多模态 RAG 需要一套文档解析评测包

多模态 RAG、Agent 和 MCP 正把文档解析推到更靠前的位置:PDF、Office、扫描件、表格、公式和图表不再只是“转成文本”,而是进入知识库前的关键数据工程。近期 OmniDocBench 增加 EvalScope 集成,RAG-Anything 继续强化多模态管线&#xff0…

2026/8/6 18:05:46 阅读更多 →
5分钟上手draw.io桌面版:完全免费的跨平台图表工具实战指南

5分钟上手draw.io桌面版:完全免费的跨平台图表工具实战指南

5分钟上手draw.io桌面版:完全免费的跨平台图表工具实战指南 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 还在为寻找一款既专业又免费的图表软件而烦恼吗&#xf…

2026/8/6 18:04:46 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →