近期,因为工作需要,迈入了IR驱动软件的设计和编码。在此过程中,一路坎坷,总结了下文中的内容,希望能够对做IR遥控,或者对IR遥控有兴趣的小伙伴,各大群体,技术牛人提供参考。
1. 分层设计
分层设计在所有的软件架构设计中,都是普遍存在的设计思想。红外遥控的设计亦是如此,具体分为了以下层次:
应用层 |
协议层 |
通用适配层 |
HW驱动层 |
下面自上而下的进行描述:
1.1 应用层
所谓的应用层,即在实际的使用过程中,能够看到明显效果的一种软件控制逻辑。我们知道,对于每一种遥控器而言,都有不同的按键功能,他们之间大同小异。遥控器中的某个按键被按下去之后,能够远程控制接收方执行某个对应的事件。而这些内容在应用层中百花齐放。
主要内容:
(1)定义规则:命令和地址
命令 | 特定的命令对应特定的事件或功能 |
地址 | 特定的设备 |
(2)发送与执行
发送 | 人机交互的体现,将某个动作封装为一组编码数据 |
执行 | 解析命令后执行相应的事件或功能 |
(3)与协议层通信
1.2 协议层
所谓协议层,即对红外协议的具体实现。这里可以是通用,标准的协议(例如RC5,RC6,NEC),也可以是自定义协议。
主要内容:
(1)实现红外协议的编解码逻辑
(2)为应用层提供接口及解码数据
1.3 通用适配层
这一层其实可以作为非必须的层级划分。这里所谓的通用,其实是对协议层和驱动层适配性的具体实现。为了适配所有的协议和不同的硬件平台。
主要内容:
(1)实现不同协议之间的通用数据处理逻辑
(2)实现对不同硬件平台的编解码的封装和修改
(3)为协议层提供接口
1.4 HW驱动层
这一层是相对独立的一个层次划分,主要取决于选择的硬件平台,因为每个SOC,MCU产商对于IR驱动的设计存在着一定的差异,当然实现的原理都区别不大。
部分产商会将IR作为完全独立的外设模块,而有些会通过定时器,GPIO的组合实现。那么这一层的主要内容:
(1)实现IR初始化,配置,启动,停止,中断逻辑
(2)实现数据帧的发送与接收
2. 参考设计
在前文的基础上,这里的参考设计的概念是一种学习、理解和使用的过程。主要分为两个部分:
(1)红外协议的理解
(2)开源项目的参考
红外遥控已经是非常成熟的技术,市面上的各式各样的红外协议,都有着相同的特征,都是将脉冲宽度表示为一种特定bit数据和含义。因此,在学习和理解常见的红外协议,有助于整个开发项目的深入掌握。
这里介绍两个开源项目:助力项目的高效运行
(1)LIRChttps://sourceforge.net/projects/lirc/
linux下C语言开发的开源项目,设备驱动,和文件IO思想较为集中,编解码逻辑非常丰富。
Arduino上C++开发的开源红外遥控器库,红外协议的编解码逻辑性强,API丰富,非常适合学习和理解红外协议。