时间:2025-09-08 00:00
人气:
作者:admin
本文以MicroPython红外传感器驱动为例,3步搞定代码阅读,快速上手新模块开发。
对于新手而言,首次阅读陌生代码比较困难,看不懂写的是什么、如何进行测试?都是常见的问题。
接下来,我们以 MicroPython 版本的红外收发模块驱动代码为例,讲解如何使用 AI 工具辅助快速阅读并理解陌生代码,以便未来能独立处理其他模块的代码。
与此同时,该文章也旨在教会新手使用 AI 工具来:

关于我们更多介绍可以查看云文档:Freak 嵌入式工作室云文档,或者访问我们的 wiki:https://github.com/leezisheng/Doc/wik
全网最适合入门的面向对象编程教程:00 面向对象设计方法导论
全网最适合入门的面向对象编程教程:01 面向对象编程的基本概念
全网最适合入门的面向对象编程教程:02 类和对象的 Python 实现-使用 Python 创建类
全网最适合入门的面向对象编程教程:03 类和对象的 Python 实现-为自定义类添加属性
全网最适合入门的面向对象编程教程:04 类和对象的Python实现-为自定义类添加方法
全网最适合入门的面向对象编程教程:05 类和对象的Python实现-PyCharm代码标签
全网最适合入门的面向对象编程教程:06 类和对象的Python实现-自定义类的数据封装
全网最适合入门的面向对象编程教程:07 类和对象的Python实现-类型注解
全网最适合入门的面向对象编程教程:08 类和对象的Python实现-@property装饰器
全网最适合入门的面向对象编程教程:09 类和对象的Python实现-类之间的关系
全网最适合入门的面向对象编程教程:10 类和对象的Python实现-类的继承和里氏替换原则
全网最适合入门的面向对象编程教程:11 类和对象的Python实现-子类调用父类方法
全网最适合入门的面向对象编程教程:12 类和对象的Python实现-Python使用logging模块输出程序运行日志
全网最适合入门的面向对象编程教程:13 类和对象的Python实现-可视化阅读代码神器Sourcetrail的安装使用
全网最适合入门的面向对象编程教程:全网最适合入门的面向对象编程教程:14 类和对象的Python实现-类的静态方法和类方法
全网最适合入门的面向对象编程教程:15 类和对象的 Python 实现-__slots__魔法方法
全网最适合入门的面向对象编程教程:16 类和对象的Python实现-多态、方法重写与开闭原则
全网最适合入门的面向对象编程教程:17 类和对象的Python实现-鸭子类型与“file-like object“
全网最适合入门的面向对象编程教程:18 类和对象的Python实现-多重继承与PyQtGraph串口数据绘制曲线图
全网最适合入门的面向对象编程教程:19 类和对象的 Python 实现-使用 PyCharm 自动生成文件注释和函数注释
全网最适合入门的面向对象编程教程:20 类和对象的Python实现-组合关系的实现与CSV文件保存
全网最适合入门的面向对象编程教程:21 类和对象的Python实现-多文件的组织:模块module和包package
全网最适合入门的面向对象编程教程:22 类和对象的Python实现-异常和语法错误
全网最适合入门的面向对象编程教程:23 类和对象的Python实现-抛出异常
全网最适合入门的面向对象编程教程:24 类和对象的Python实现-异常的捕获与处理
全网最适合入门的面向对象编程教程:25 类和对象的Python实现-Python判断输入数据类型
全网最适合入门的面向对象编程教程:26 类和对象的Python实现-上下文管理器和with语句
全网最适合入门的面向对象编程教程:27 类和对象的Python实现-Python中异常层级与自定义异常类的实现
全网最适合入门的面向对象编程教程:28 类和对象的Python实现-Python编程原则、哲学和规范大汇总
全网最适合入门的面向对象编程教程:29 类和对象的Python实现-断言与防御性编程和help函数的使用
全网最适合入门的面向对象编程教程:30 Python的内置数据类型-object根类
全网最适合入门的面向对象编程教程:31 Python的内置数据类型-对象Object和类型Type
全网最适合入门的面向对象编程教程:32 Python的内置数据类型-类Class和实例Instance
全网最适合入门的面向对象编程教程:33 Python的内置数据类型-对象Object和类型Type的关系
全网最适合入门的面向对象编程教程:34 Python的内置数据类型-Python常用复合数据类型:元组和命名元组
全网最适合入门的面向对象编程教程:35 Python的内置数据类型-文档字符串和__doc__属性
全网最适合入门的面向对象编程教程:36 Python的内置数据类型-字典
全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式
全网最适合入门的面向对象编程教程:38 Python常用复合数据类型-使用列表实现堆栈、队列和双端队列
全网最适合入门的面向对象编程教程:39 Python常用复合数据类型-集合
全网最适合入门的面向对象编程教程:40 Python常用复合数据类型-枚举和enum模块的使用
全网最适合入门的面向对象编程教程:41 Python常用复合数据类型-队列(FIFO、LIFO、优先级队列、双端队列和环形队列)
全网最适合入门的面向对象编程教程:42 Python常用复合数据类型-collections容器数据类型
全网最适合入门的面向对象编程教程:43 Python常用复合数据类型-扩展内置数据类型
全网最适合入门的面向对象编程教程:44 Python内置函数与魔法方法-重写内置类型的魔法方法
全网最适合入门的面向对象编程教程:45 Python实现常见数据结构-链表、树、哈希表、图和堆
全网最适合入门的面向对象编程教程:46 Python函数方法与接口-函数与事件驱动框架
全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback
全网最适合入门的面向对象编程教程:48 Python函数方法与接口-位置参数、默认参数、可变参数和关键字参数
全网最适合入门的面向对象编程教程:49 Python函数方法与接口-函数与方法的区别和lamda匿名函数
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
全网最适合入门的面向对象编程教程:51 Python函数方法与接口-使用Zope实现接口
全网最适合入门的面向对象编程教程:52 Python函数方法与接口-Protocol协议与接口
全网最适合入门的面向对象编程教程:53 Python字符串与序列化-字符串与字符编码
全网最适合入门的面向对象编程教程:54 Python字符串与序列化-字符串格式化与format方法
全网最适合入门的面向对象编程教程:55 Python字符串与序列化-字节序列类型和可变字节字符串
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
全网最适合入门的面向对象编程教程:57 Python字符串与序列化-序列化与反序列化
全网最适合入门的面向对象编程教程:58 Python字符串与序列化-序列化Web对象的定义与实现
全网最适合入门的面向对象编程教程:59 Python并行与并发-并行与并发和线程与进程
一文速通Python并行计算:01 Python多线程编程-基本概念、切换流程、GIL锁机制和生产者与消费者模型
一文速通Python并行计算:02 Python多线程编程-threading模块、线程的创建和查询与守护线程
一文速通Python并行计算:03 Python多线程编程-多线程同步(上)—基于互斥锁、递归锁和信号量
一文速通Python并行计算:04 Python多线程编程-多线程同步(下)—基于条件变量、事件和屏障
一文速通Python并行计算:05 Python多线程编程-线程的定时运行
一文速通Python并行计算:06 Python多线程编程-基于队列进行通信
一文速通Python并行计算:07 Python多线程编程-线程池的使用和多线程的性能评估
一文速通Python并行计算:08 Python多进程编程-进程的创建命名、获取ID、守护进程的创建和终止进程
一文速通Python并行计算:09 Python多进程编程-进程之间的数据同步-基于互斥锁、递归锁、信号量、条件变量、事件和屏障
一文速通Python并行计算:10 Python多进程编程-进程之间的数据共享-基于共享内存和数据管理器
一文速通Python并行计算:11 Python多进程编程-进程之间的数据安全传输-基于队列和管道
一文速通Python并行计算:12 Python多进程编程-进程池Pool
一文速通Python并行计算:13 Python异步编程-基本概念与事件循环和回调机制
一文速通Python并行计算:14 Python异步编程-协程的管理和调度
给你的 Python 加加速:一文速通 Python 并行计算
一个MicroPython的开源项目集锦:awesome-micropython,包含各个方面的Micropython工具库
万字长文手把手教你实现MicroPython/Python发布第三方库
工科比赛“无脑”操作指南:知识学习硬件选购→代码调试→报告撰写的保姆级路线图
爆肝整理长文】大学生竞赛速通指南:选题 × 组队 × 路演 48 小时备赛搞定
女大学生摆摊亏损5000元踩点实录:成都哪里人最多、最容易赚到钱?我告诉你!
普通继电器 vs 磁保持继电器 vs MOS管:工作原理与电路设计全解析
告别TP4056!国产SY3501D单芯片搞定充放电+升压,仅需7个元件!附开源PCB文件
AI 工具选择:我们将使用大型语言模型(如 ChatGPT、Claude、DeepSeek-Coder、Kimi 等)作为核心辅助工具。它们能解释代码、翻译注释、生成示例,甚至推理逻辑。
目标代码:假设我们的目标是学习并使用一个陌生的驱动库来控制红外发射和接收。
知识管理工具:按照建议,飞书文档 是最佳选择。我们将在飞书中创建一个新文档,并按照推荐的目录结构进行整理。它的实时协作、代码块高亮、表格和流程图支持非常适合这个任务。
可视化代码阅读工具的安装与使用:Sourcetrail 是一款跨平台的开源代码可视化工具,它能自动解析代码结构,生成类、函数、文件之间的调用关系图,帮助我们快速理解陌生项目的框架:
关于可视化代码阅读工具的安装与使用基本教程可以查看:
https://blog.csdn.net/weixin_44719294/article/details/140337899
(AI 辅助用法:让 AI 总结 README 的重点,提取输入输出接口、调用方法等关键信息,避免遗漏。)
.py 文件的作用(AI 辅助用法:请 AI 绘制“模块调用关系图”或“依赖树”,比人工翻代码更高效。)
(AI 辅助用法:将函数贴给 AI,要求用“伪代码”或“流程图”形式解释逻辑,帮助快速理解代码意图。)
uasyncio 等异步框架时的注意点(AI 辅助用法:让 AI 生成“使用清单 + 注意事项表格”,新手只需对照即可上手。)
首先,我们打开示例代码网址:https://github.com/peterhinch/micropython_ir

我们首先看右侧的仓库简介:

原句:
Nonblocking device drivers to receive from IR remotes and for IR "blaster" apps.
翻成中文就是:
“用于接收红外遥控器并用于红外‘发射器(blaster)’应用的非阻塞设备驱动程序。”
这里,我们可以将该段话输入给 AI,并辅助说明:

这里,对于新手来说,往往有许多基础知识缺乏,需要对 AI 明确指出,需要结合基础知识进行讲解:

以上,我们不难猜测到,该代码中可以分为协议层和物理实现层,即:

上面讲解了红外收发模块,发送和接收的基本软件实现思路和硬件原理。

以上,主要讲解了该代码在设计和应用时的注意事项。
接下来,我们继续看仓库的 README 文件:


老规矩,直接复制粘贴,喂给 AI,同时在最开始加上:对下面 进行详细解读 结合基础知识

没有使用异步编程,猜测是使用中断 + 定时器进行替代,继续看:

这里,说明了该驱动库适合在哪些 MCU 上运行以及早期版本的 BUG 和解决方法。

这里是基础的通信原理知识。

这里,讲解了该代码支持哪些编码协议及其优缺点,如果进行测试的话,作者推荐首选 NEC 编码。

这里是推荐的硬件,这个时候需要注意购买电子元器件/模块的具体参数。

对于 38KHz 的接收头来说,只有三个协议支持,如果是笔者进行测试/简单应用,则只测试这三个协议。

接收中断的注意事项和适配硬件,前文已经提到,简单跳过即可。


以上为代码实现的注意事项,简单看过即可。

这些是实际调试技巧,要额外记住,在测试代码时要回看该部分知识。

这些是一些排除错误的方法,包括软件和硬件方面的,要额外记住,在测试代码时要回看该部分知识。
回到刚刚的网站,可以看到还有三个 README 文件我们没有查看:

先打开 RECEIVER.md,根据名字我们不难推断这里是讲解红外接收部分代码的文件:

快速概览,可以看到分成下面几个目录:
后面则是两个协议附录,这部分一般不需要详细了解:

接下来,我们一段一段喂给 AI 即可:




这个是使用 mpremote 工具和 mip 库来安装包,也可以将代码下载下来进行烧录。



在解读协议层时,我们可以看到有好几个协议,此时我们可以要求 AI 列表格对比:


可以看到,几个协议都有共同的抽象基类,应该是通过类的继承实现的,三个协议类都有共同的公共方法:


下面是常见错误与解析:

可以看到类中还定义了一些错误常量,在调试时可以根据对应错误常量判断错误类型:



上面讲解了,如何打印错误,在发生错误时可以通过该函数来打印错误类型到 REPL 中。
接下来到了已经测试的 MCU 平台和结果对比:



下面是工作原理部分:






接下来是异步的实现和注意事项:




接下来,我们来看 TRANSMITTER.md 文件,这部分讲解了红外发送代码:

可以看到,整体目录相似,接下来,我们只需要一段一段喂给 AI 即可:
首先是引脚相关:



接着是安装依赖库:



接下来就是协议层和物理层实现的思路讲解,老规矩,列表格!



接着就是工作原理的具体讲解:


接下来就是对不支持的协议说明和对应解决方法了:


接下来,是 RP2_RMT.md 文件,这部分应该是对 PIO 汇编实现思路的基本讲解,直接喂给 AI 即可,考虑到我们的目的就是快速应用,这部分简略观看即可:




这里,我们首先需要下载安装 Sourcetrail 软件,具体安装和使用教程可以查看:
https://blog.csdn.net/weixin_44719294/article/details/140337899
接着,我们需要下载源代码:

使用 Sourcetrail 软件打开,这里,我们首先分析接收部分代码:


接着添加 G:\micropython_ir-master\ir_rx 文件夹下代码文件:

注意,此时务必勾选最下面的选项,开始生成:

现在生成了分析结果:

点击文件可以看到,总共有 8 个文件:

根据上面红外接收部分 README 文件解读结果,你可以使用 AI 生成一个无序表格,总结各个文件作用,但是此时一定要注意对照是不是正确:


接下来,我们一个文件一个文件进行查看,首先点开初始化文件:

其中,蓝色方框代表属性、黄色为类的方法,注意,这里我们只是应用该代码,所以直接输入给 AI,让 AI 总结每个方法的入口参数、返回参数和作用:



依据上面 1.3.4 代码架构解析 总结的内容,该类为抽象基类,其余各个协议类继承于 IR_RX 类,我们一路返回到 overview 页面,点击 Classes:

然后点击 IR_RX 类

可以看到,有六个类都继承于 IR_RX 类,六个类都是不同协议的具体实现,除了父类的方法外,都有各自不同的 decode 解码方法以及其他一些内置属性和方法:

点开 RC5_IR 类,可以看到它在 philips.py 文件下面:

打开浏览器的代码页面,philips.py 文件有两个类:RC6_M0 类和 RC5_IR 类,结合前面 1.2.3 IR 协议相关中内容,二者关系不难理解:

这里,由于我们侧重于快速应用,因此 decode 编码方法的具体实现与原理可以略过。
类似地,mce.py、nec.py、sony.py 显然类似都是这样的情况:

根据前面的提示,我们知道了 ir_rx/acquire.py 文件是在红外协议未知时,用于捕获一个数据帧进行分析,结果需要人工判断,应该是使用里面的 IR_GET 类:

接着,我们继续查看其他文件,ir_rx/print_error.py 中声明了一个错误类型的字典和打印错误的函数,可以使用 print_error 函数打印错误类型和错误提示信息:

接着,就是 ir_rx/test.py 文件,根据名字不难判断,其中为测试文件:

主要流程同上,新建一个 micropython_ir_tx 分析工程:


仍然是喂给 AI:

首先打开 ir_tx/__init__.py 文件,可以看到里面有两个类:

根据前文内容可以知道:

IR 类主要用于脉冲序列生成和触发后台发送;Player 类继承自 IR 类,提供一种最小化的“波形直接播放”能力,常用于“录制-回放”场景(acquire 捕获后用 Player 回放)。

其他的几个在 ir_tx/mce.py、ir_tx/nec.py、ir_tx/philips.py 和 ir_tx/sony.py 文件中不同协议具体实现的类,都继承于 IR 类,各自都有其实现的 tx 发送方法:


对于 RP2040 上实现协议发送的特定 ir_tx/rp2_rmt.py 文件来说,在 ir_tx/__init__.py 文件中被导入:

对于 MCE 而言,还有一个特定测试文件 ir_tx/mce.py:

需要配合按键进行测试。
在通用的 ir_tx/test.py 文件中,可以看也添加了异步支持。

这里,只需要使用 AI 一个文件一个文件分析即可,以 ir_rx/nec.py 文件为例,在粘贴复制的文件前,在 AI 前面加入:
说明以下代码中 每个方法的工作原理和详细解读 结合基础知识:



依次在文件中进行即可。
以红外收发驱动代码为例,在了解了每个方法的实现原理和代码文件组织后,我们最核心的任务就是将驱动库利用起来,显然,最常见的使用 NEC 编码即可实现大部分功能,因此我们刚开始应用时仅需要研究如何使用红外收发模块发送和接收 NEC 编码,实现这个目的包括哪些文件需要去掉、哪些文件、需要新增哪些文件 (测试代码在 main.py)。
即尽快把驱动库裁剪成一个可用的、占用最小内存的工程,能接收 NEC 并发射 NEC(用于大多数家电遥控场景)。
我们询问 AI 即可,其实,经过 代码文件结构和关系梳理章节** **,我们已经了解到 各自协议类(发送和接收)其实都继承于 __init__.py 文件中的基类,因此该文件必须保留,同时还要保留各自协议类(发送和接收)对应的 py 文件,以及在特定平台上的功能文件。
建议的工程结构为:
irtranslation/
├─ ir_rx/ # 保留:接收端包(只复制需要的文件)
│ ├─ __init__.py
│ ├─ nec.py # 必需(NEC 解码)
│ ├─ print_error.py # 建议保留(调试用)
│ └─ acquire.py # 可选(用于嗅探/回放,不必要可删除)
│
├─ ir_tx/ # 保留:发射端包(只复制需要的文件)
│ ├─ __init__.py
│ ├─ nec.py # 必需(NEC 发送)
│ └─ rp2_rmt.py # 如果用 Pico,则保留;否则可删
│
├─ main.py # 新增:应用主程序(接收 + 发射/测试)
├─ README.md # 说明文件
nec.py,不要一次性 import 整个包内所有协议。sony.py、philips.py、mce.py、mcetest.py、test.py(通用示例)等)在设备上可不拷贝,以节省空间。接下来,我们首先将驱动库中 ir_rx 文件夹下 nec.py、print_error.py 和 __init__.py 文件原封不动输入给 AI:

接着输入一段话:
如何使用NEC_8类,接收一段红外信号,同时需要考虑错误发生的情况
可以看到输出了可以使用的示例:


from machine import Pin
from nec import NEC_8
from print_error import print_error
# 用户回调函数:收到数据后会被 NEC_8 调用
def ir_callback(cmd, addr, ext):
if cmd >= 0:
# 正常解码成功
print("✅ 收到按键: 地址 =", hex(addr), "命令 =", hex(cmd))
else:
# 出现错误或重复码
print_error(cmd)
# 初始化 NEC_8 解码器
ir = NEC_8(Pin(16, Pin.IN), ir_callback)
print("红外接收已启动,按下遥控器按键测试...")
对于红外发射部分来说,继续上面的流程:

同时如果使用树莓派 Pico,还需要将 ir_tx/rp2_rmt.py 文件输入到 AI 中去:

接下来,输入测试平台(树莓派 Pico)、测试文件目录组织和具体要求:
在树莓派 Pico 上 测试 NEC_8 类,发送和接收一段红外信号,同时需要考虑错误发生的情况
代码文件目录组织如下:
project/
├─ ir_rx/ # 保留:接收端包(只复制需要的文件)
│ ├─ init.py
│ ├─ nec.py # 必需(NEC 解码)
│ ├─ print_error.py # 建议保留(调试用)
│ └─ acquire.py # 可选(用于嗅探/回放,不必要可删除)
│
├─ ir_tx/ # 保留:发射端包(只复制需要的文件)
│ ├─ init.py
│ ├─ nec.py # 必需(NEC 发送)
│ └─ rp2_rmt.py # 如果用 Pico,则保留;否则可删
│
├─ main.py # 新增:应用主程序(接收 + 发射/测试)
├─ README.md # 说明文件
并点击思考时间更长:

根据 AI 输出的代码和信息,按照规范测试即可:

# main.py
# Raspberry Pi Pico 测试 NEC 发射 + 接收 示例
# 同时处理错误码(使用 ir_rx.print_error)和 repeat 行为
#
# 说明:
# - 将红外发射 LED 连接到 TX_PIN(建议通过 NPN 或 MOSFET 驱动)
# - 将红外接收模块 OUT 引脚连接到 RX_PIN
# - 也会闪烁板载 LED(GP25)来指示接收到有效命令或 repeat
from machine import Pin
from time import sleep_ms, ticks_ms
# 接收端与错误打印
from ir_rx.nec import NEC_8
from ir_rx.print_error import print_error
from ir_rx import IR_RX # 用于引用 REPEAT 常量等
# 发射端
from ir_tx.nec import NEC as NEC_TX
# === 用户可配置项 ===
TX_PIN = 15 # 红外 LED 驱动管脚(GPIO15)
RX_PIN = 16 # 红外接收器 OUT 管脚(GPIO16)
ONBOARD_LED = 25 # Pico 板载 LED 管脚
# 如果你只有一块板并希望自行发射并同时接收(把 LED 对着接收头),设置为 True
LOOPBACK_TEST = True
# 测试要发送的 NE C地址/命令
TEST_ADDR = 0x10
TEST_DATA = 0x45
SEND_INTERVAL_MS = 3000 # 每次发射间隔
# 是否在接收有效 command 时保存其为“最近有效”
KEEP_LAST_ON_VALID = True
# ========================
led = Pin(ONBOARD_LED, Pin.OUT)
# 发射器(NEC 发射类)
tx = NEC_TX(Pin(TX_PIN, Pin.OUT), freq=38000, verbose=False)
# 全局状态,保存最近一次有效命令以便处理 REPEAT
state = {
'last_cmd': None,
'last_addr': None,
'last_time': 0 # ms ticks
}
def handle_action(addr, cmd):
"""
根据接收到的 (addr, cmd) 执行示例动作。
在这里仅通过板载 LED 快闪做示范(你可以替换为具体业务逻辑)。
"""
print(">>> 执行动作: addr=0x{:02x}, cmd=0x{:02x}".format(addr, cmd))
# 快闪 LED 表示收到命令
led.value(1)
sleep_ms(120)
led.value(0)
def handle_repeat():
"""
处理长按重复(REPEAT)逻辑:
- 如果之前有记录的 last_cmd,将其视为长按并重复执行动作(示例中每次闪烁)
- 否则打印提示
"""
if state['last_cmd'] is None:
print("收到 REPEAT,但没有上一次有效命令。忽略。")
return
print("收到 REPEAT(长按),重复上一次命令 addr=0x{:02x} cmd=0x{:02x}".format(
state['last_addr'], state['last_cmd']))
# 示例:每次 repeat 只做一次动作(你也可以用循环连续加速等)
handle_action(state['last_addr'], state['last_cmd'])
def ir_rx_callback(cmd, addr, ext):
"""
接收器回调(由 NEC_8 在解码后调用)
- cmd >= 0: 有效按键
- cmd < 0: 错误或 REPEAT(用 print_error 打印)
"""
# cmd 为整数,成功时是非负命令值;错误/特殊值为 IR_RX.* 常量(负数)
if cmd >= 0:
print("✅ 解码成功: addr=0x{:02x}, cmd=0x{:02x}".format(addr, cmd))
# 保存最近有效命令(用于 repeat)
if KEEP_LAST_ON_VALID:
state['last_cmd'] = cmd
state['last_addr'] = addr
state['last_time'] = ticks_ms()
# 执行示例动作
handle_action(addr, cmd)
else:
# 错误或重复码
if cmd == IR_RX.REPEAT:
# REPEAT: 使用上次地址(NEC 接收端会把 addr 设为上次的 addr)
# 这里调用 repeat 处理函数
handle_repeat()
else:
# 其它错误:交给 print_error 打印可读信息
print_error(cmd)
# 初始化接收器
rx = NEC_8(Pin(RX_PIN, Pin.IN), ir_rx_callback)
print("NEC 发射/接收测试已启动")
print("TX_PIN={}, RX_PIN={}".format(TX_PIN, RX_PIN))
print("LOOPBACK_TEST =", LOOPBACK_TEST)
print("按 Ctrl-C 退出")
try:
# 主循环:如果启用 LOOPBACK_TEST,则定期发射测试命令,并观察接收回调
while True:
if LOOPBACK_TEST:
print("\n>>> 发射测试 NEC 命令: addr=0x{:02x}, data=0x{:02x}".format(TEST_ADDR, TEST_DATA))
# transmit 会在底层等待 busy() 清空
tx.transmit(TEST_ADDR, TEST_DATA)
# 等待一小段时间再发送 repeat 测试(长按模拟)
sleep_ms(500)
print(">>> 发射 repeat(模拟长按)")
tx.repeat() # 发一个 repeat 帧
# 多次 repeat 演示(可注释)
sleep_ms(180)
tx.repeat()
sleep_ms(180)
tx.repeat()
# 等待下一次完整发送
sleep_ms(SEND_INTERVAL_MS)
else:
# 如果不发射,仅空循环等待接收器回调触发
sleep_ms(200)
except KeyboardInterrupt:
print("\n终止:用户请求退出")
finally:
# 清理接收器(解除中断等)
try:
rx.close()
except Exception as e:
print("关闭 rx 时异常:", e)
# 如果需要可以关闭发射资源(库中没有统一的 close 接口)
print("已退出,资源已清理(如有)。")
同时按照 AI 提示,注意硬件接线:


