前面的文章中我们已经知道如何获取遥控器的红外编码,以及通过单片机重放红外信号,来遥控空调。但是这样是远远不够的,要想让家电智能起来,我们需要把模块接入一些高级点的系统中,比如树莓派,然后通过Linux系统来控制红外发射。下面我们将介绍如何使用Linux与红外模块交互。

1.通信协议的制定

就目前而言,模块与外界通信的渠道只有串口可以使用,所以我们决定使用串口与树莓派进行通信。但是只要制定好双方通信的协议,两者才能合理正确地通信,不然就像你说英语我说中文,鸡同鸭讲。

通信协议采用比较简单的方式,包括起始位数据个数数据三个部分组成。

  • 起始位:占一个字节,用来标识报文的开始,数值为0x2B
  • 数据个数:占一个字节,用来标识之后数据的数量,最大为0XFF,即后面的数据最长为255个
  • 数据:传输的有效载荷,实际的数据
举个例子2B 03 11 22 33有效数据位 11 22 33

2.单片机端解析报文

单片机端需要在串口接收中断中根据协议来处理报文,处理的代码如下。


/*用来标识是否正在使用缓存区*/
bit buf_empty = 0;/*报文起始位有效,接收后续报文*/
bit rec_start = 0;/*该则报文接收到的数据个数*/
unsigned char rec_counter = 0;/*该则报文需要接收的数据个数*/
unsigned char rec_sum = 0;/*需要处理的数据个数*/
unsigned char snd_sum = 0;/*接收缓存区*/
unsigned char idata recv_buff[MAX_BUF];/*protocol: | start | byte count | byte0 | byte1 | ...*/
void Uart_Isr() interrupt 4 using 1
{/*receive data*/if (RI && buf_empty){unsigned char ch = SBUF;RI = 0;          /*normal bytes*/if(rec_start && rec_sum != 0){recv_buff[rec_counter++] = ch;}/*the amount of all bytes*/if(rec_start && 0 == rec_sum){snd_sum = rec_sum = ch;} /*start byte*/if(!rec_start && DATA_PREFIX == ch){rec_start = 1; }if(MAX_BUF == rec_counter || (rec_sum != 0 && rec_sum <= rec_counter)){/*buff is full*/rec_counter = 0;buf_empty = 0;rec_sum = 0;rec_start = 0;}       }/*send data*/if (TI){TI = 0;             busy = 0;           }
}

3.树莓派端报文发送程序

树莓派端需要实现串口的读写即可,代码如下。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <termios.h>#define MAX_SIZE 256void init_series(int fd)
{struct termios t ;tcgetattr( fd , &t) ;t.c_cflag &=~CSIZE ;t.c_cflag &=~CSTOPB;t.c_cflag |= CREAD ;t.c_cflag |= CLOCAL ;t.c_cflag &= ~CRTSCTS;t.c_cflag |= CS8;cfsetispeed( &t , B9600);cfsetospeed( &t , B9600);tcflush( fd , TCIOFLUSH);tcsetattr( fd , TCSANOW ,&t);
}/*这里没有写协议封装函数*/
char air_on[] =  {0x2B, 104, 01, 01, 00, 00, 00, 00, 01, 01, 01, 01, 01, 00, 01, 00, 00, 01, 00, 00, 00, 00, 00, 01, 01, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 01, 00, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 01, 00, 01, 00, 00, 00, 00, 00, 01, 01, 01, 01, 01, 00, 00, 00};char air_off[] = {0x2B, 104, 01, 01, 00, 00, 00, 00, 01, 01, 01, 01, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 01, 01, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 01, 00, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 01, 00, 01, 00, 00, 00, 00, 00, 01, 01, 01, 01, 00, 00, 01, 00};int main(int argc, char **argv)
{int fd ;int count ;char *buff_send = NULL;if(argc <2){printf("please input args!\n");return 0;}fd = open("/dev/ttyUSB0" , O_RDWR  | O_NOCTTY );if(fd<0){printf("open series error\n");return 0 ;}init_series(fd);switch(argv[1][0]){case 'n':case 'N': buff_send = air_on; break;case 'f':case 'F': buff_send = air_off; break;default: break;}if(buff_send != NULL){write(fd , buff_send , 104+2);}close(fd);return 0 ;
}

OK啦,现在可以通过Linux来控制空调啦!但是这样貌似还不是很方便,如果想远程通过手机来控制的话可能会更方便,后面的文章将介绍搭建简单的物联网云平台,然后将手机和树莓派接入云平台实现远程控制空调。

万能遥控器小制作(四)相关推荐

  1. 万能遥控器小制作(二)

    1.想法 我的整体想法是通过红外接收头对遥控器发射的信号波形进行记录,然后使用的时候只要根据记录的数据发射就可以了. 现在手头上的模块包括以下三个部分组成. 所以,可以通过单片机对接收到的信号进行记录 ...

  2. 万能遥控器小制作(一)

    六月这段时间一直在学车,所谓"学车苦,学车累,司机一滴酒,亲人两行泪"-还好在毕业时分拿到了驾照,感谢苍天.时值夏日,租的房子电价贼贵,不分峰谷电,不敢整夜开空调,但是早上老是会被 ...

  3. diy:自制作四种智能小电器

    <物美智能>系列文章目录 一款强大的物联网管理平台介绍-<物美智能> 教程一:阿里云使用docker快速部署服务端 教程二:本地配置服务端开发环境 教程三:硬件端-Arduin ...

  4. 小孔成像实验探究的软件_【亲子实验】科学小制作:神秘小潜艇科学小论文作品在科学课(小学版)2004年第5期发表,科学小发明潜水艇与沉浮子...

    kxxsy科学小实验 作者:王渔滨 湖南省资兴市 东江镇中心完小 科学兴趣小组 校园小记者 编者寄语 亲爱的同学们,尊敬的家长朋友们:亲子实验是以科学小实验.小制作.小发明和科学探究为主要内容的家庭科 ...

  5. 如何使用纯 CSS 制作四子连珠游戏

    序言:你是否想过单纯使用 CSS 也可以制作一款游戏?甚至可以双人对决!这是一篇非常有趣的文章,作者详细讲解了使用纯 CSS 制作四子连珠游戏的思路以及使用奇淫巧技解决困难问题的方法.因为案例本身比较 ...

  6. 无需编程的BEAM昆虫积木机器人~适合小孩子的益智DIY小制作

    BEAM 是一种有简单反映.易于学习的机器人技术.大多数的BEAM机器人没有使用微处理器(虽然简单的处理器能被用于控制它们运动).BEAM机器人它便宜.简单.拥有一些基础知识的爱好者能在几个小时内完成 ...

  7. excel计算机不准确,Excel小教程四十一:关于Excel计算不准确,我们应该这样解决!...

    原标题:Excel小教程四十一:关于Excel计算不准确,我们应该这样解决! 我们有时候在用excel进行计算的时候,会遇到Excel计算不准确的的时候! 别怕,先听小雅为您一一道来! 5.1-5.2 ...

  8. 计算机基础知识整理 手抄报,科技小制作的手抄报资料简单字少

    科学是一切生活的基础,如同一把钥匙,为我们开辟前进的道路.科技在我们的生活中也是很重要的.你会做科技手抄报吗?下面是学习啦小编为大家带来的有关科技小制作的手抄报,希望大家喜欢. 有关科技小制作的手抄报 ...

  9. 微信小程序四种父子相互传值方式

    微信小程序四种父子相互传值方式 1. 绑定自定义属性(父传子),触发自定义方法 (子传父) 原生微信小程序+uni-app都可以实现 父组件: <template><view cla ...

最新文章

  1. 关于window.localtion的用法几点总结
  2. 助你进大厂,这些Mysql索引底层知识你是必须知道的。
  3. MySQL数据库:完整性约束
  4. 二十万字C/C++、嵌入式软开面试题全集宝典九
  5. mysql 导入sql脚本_mysql 导入 sql文件
  6. 比较精确的js倒计时实现
  7. iOS开发中经常用的实用代码合集
  8. MySQL压测工具--sysbench
  9. Boost高性能网络编程
  10. Visio 2013 破解工具 - KMSpico(亲测可用)
  11. 《数字图像处理 第三版》(冈萨雷斯)——第十二章 目标识别
  12. pyhon实现excel的转置
  13. 新东方 词根词缀 excel_背单词 | 新东方的杨鹏老师用什么方法?
  14. OKA通证权益解析,参与Okaleido生态建设的不二之选
  15. 创建oracle数据库到达梦数据库的dblink
  16. halcon机器视觉实例1--表面划痕检测
  17. MSCOMM32控件注册的两种办法
  18. wifi 小程序 透传_微信小程序之一键连接wifi
  19. 由开发者的人品问题领略测试人员的人品问题
  20. react讲解(函数式组件,react hook)

热门文章

  1. 通常所说的微型计算机主机主要包括,通常所说的微型计算机的主机主要包括( )。...
  2. vmware+双显示器实现双系统同时使用
  3. Java随机更换背景图片_利用Java处理图片,更换背景
  4. Python爬虫进阶--js逆向-某天下与某某二手房密码加密分析
  5. 机器人搭建记录 yobot(LinuxWindows手动搭建)
  6. Python 机器人学习手册:1~5
  7. 笔算开2次方根、3次方根详细教程
  8. 世界知名洋酒种类及酒具的使用
  9. java浮点型数据的比较
  10. 用户使用报告_分享短视频最新2020年抖音用户画像报告