最近在调试红外遥控格力空调,在论坛中学到了不少东西。参考:

(1)《解决问题系列(4)——红外编码分析利器使用

(2)《315Mhz模块传输替代315Mhz遥控器

调试环境:

软件:Arduino IDE 1.0

硬件:Arduino uno r3

问题分>

我使用的遥控器型号是YAD0F。

在使用逻辑分析仪dump出原始码之后,使用sendRaw函数来发送原始码,发现空调没有反应。原始码如下:

,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,;

受到文章《Arduino红外遥控格力空调的问题》的启发,认为有可能是溢出的问题。

将这段原始码使用sendRaw发送,然后使用逻辑分析仪dump出它的原始码:

,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,

对比两段原始码,发现了溢出的值:

遥控发送后接收的

原始码

sendRaw发送后再次接收的

原始码

备注

19942

3560

19942除以16383的余数为3558,溢出1次

39952

7185

39952除以16383的余数为7184,溢出2次

19941

3533

19941除以16383的余数为3557,溢出1次

通过分析IRremote的库文件之后,共发现了两处会导致溢出的地方:

(1)       void delayMicrosecond(us)函数。delayMicroseconds函数的参数取值范围是0-16383。

(2)       void space(int usec)函数和void mark(int usec)函数。参数的类型为int, 其取值范围为-32768-32767。

解决方法

(1)在头文件IRremote.h中添加3个函数定义:

void sendRaw2(unsigned int buf[], int len, int hz);
VIRTUAL void mark2(unsigned int usec);
VIRTUAL void space2(unsigned int usec);

(2)在源文件IRremote.cpp中添加3个函数实现:

void IRsend::mark2(unsigned int time)  // time的类型为unsigned int
{
TIMER_ENABLE_PWM; if(time < )
{
delayMicroseconds(time);
}
else
{
unsigned int v = time / ; // 取商数
unsigned int m = time % ; // 取余数
for( int j = ; j < v; j++ ) // 暂停(v ×16383)秒
{
delayMicroseconds();
}
delayMicroseconds(m); // 暂停m秒
}
} void IRsend::space2(unsigned int time) // time的类型为unsigned int
{
TIMER_DISABLE_PWM; if(time < )
{
delayMicroseconds(time);
}
else
{
unsigned int v = time / ; // 取商数
unsigned int m = time % ; // 取余数
for( int j = ; j < v; j++ ) // 暂停(v ×16383)秒
{
delayMicroseconds();
}
delayMicroseconds(m); // 暂停m秒
}
} void IRsend::sendRaw2(unsigned int buf[], int len, int hz)
{
enableIROut(hz);
for (int i = ; i < len; i++)
{
if (i & )
{
space2(buf[i]);
}
else
{
mark2(buf[i]);
}
}
space(); // Just to be sure
}

调用方法

需要注意的是,信号线要接在3号接口上。

调用方法与调用sendRaw函数一样。

(1)引用IRremote.h库,

(2)新建一个IRsend对象;

(3)定义一个unsigned int数组用以存放原始码,

(4)调用IRsend对象的sendRaw2函数。

示例代码如下:

#include <IRremote.h>                  // 引用 IRRemote 函数库
IRsend irsend; // 新建一个IRsend对象, void setup()
{
} void loop()
{
// 原始码
unsigned int close27[] = {,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,}; irsend.sendRaw2(open27, , ); // 调用sendRaw2函数 delay(); }

库文件下载

arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法的更多相关文章

  1. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法

    转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...

  2. Arduino红外遥控系列教程2013——红外转码

    教程三:红外转码教程——用电视遥控器取代机顶盒遥控器 前言前段时间看到了使用红外遥控的X-Bot机器人[链接],感觉很有意思.最近开始玩Arduino与红外,一方面打算将来用于BOXZ的之间的通讯控制 ...

  3. 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法

    [导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...

  4. 关于swift语言中导入OC三方类找不到头文件的解决方法

    首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...

  5. 在Springmvc普通类@Autowired注入request为null解决方法

    在Springmvc普通类@Autowired注入request为null解决方法   在类中加入以下注入request对象的代码,运行时发现request为null,注入失败.在@Controlle ...

  6. Arduino红外遥控系列教程2013——发射与接收

    教程一:红外接收教程本教程共四步操作,将教大家如何收集电视红外遥控器的编码 视频链接:http://v.youku.com/v_show/id_XNTE2NjQ5NTcy.html 第一步:电路连接, ...

  7. Netty handler处理类无法使用@Autowired注入bean的解决方法

    问题由来: 公司有个项目用到netty作为websocket的实现,最近打算部署双机,这使得原来在内存中的保存Channel信息的方案不再可行,需要转移到redis中,改造过程中发现通过@Autowi ...

  8. python实用小技巧自问自答系列(一):查看类中函数文档doc的方法

    问题:如何查看某个类的方法文档说明或者是函数的参数列表情况? 答: 方法一:直接在需要查询的方法后面加上".__doc__"即可以打印出该方法的文档说明(需要先导入该方法所属模块) ...

  9. [转]动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法

    本文转自:http://blog.csdn.net/limlimlim/article/details/8647038 [导读]ServiceDescriptionImporter是创建Web Ser ...

随机推荐

  1. 带你使用h5开发移动端小游戏

    带你使用h5开发移动端小游戏 在JY1.x版本中,你要做一个pc端的小游戏,会非常的简单,包括说,你要在低版本的浏览器IE8中,也不会出现明显的卡顿现象,你只需要关心游戏的逻辑就行了,比较适合逻辑较为 ...

  2. Egret白鹭H5小游戏开发入门(二)

    前言: 昨天的文章中简单的介绍了Egret白鹭引擎从安装到基本的使用配置等问题,今天着重介绍H5小游戏开发的起步阶段,如Wing面板的使用,素材的处理,类的说明,开始布局等等. 整体概况: 根据上一篇 ...

  3. sublime快捷键

    以下是个人总结不完全的快捷键总汇,祝愿各位顺利解放自己的鼠标. 选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同 ...

  4. SharePoint 2013 图文开发系列之InfoPath入门

    本文主要介绍SharePoint 2013中,简单发布InfoPath表单,并添加后台代码,示例比较简单,主要描述的是一个创建InfoPath的过程,而非多么深奥的后台代码,希望能够给初学者带来帮助. ...

  5. MyEclipse 2016 CI 3发布

    JSjet 语法高亮 受够了Eclipse中的JavaScript编码体验?那就来试试MyEclipse 2016 CI 3.JSjet改进了JavaScript编码的语法高亮功能,大大提升了代码的可 ...

  6. iOS模态弹出半透明视图控制器

    项目中需要实现点击按钮出现的视图全屏覆盖,呈半透明状态可以看到下面的视图? 解决方案: 绕了很多弯路原来可以使用模态弹出一个视图控制器 在iOS8之后只需要设置一个最新的属性 SecondViewCo ...

  7. 代替Reflection(反射)的一些方法

    Reflection(反射)是深入学习.Net必须掌握的技能之一.最初学Reflection的时候,的确是被惊住了,原来还可以这样.只要给你一个Assembly, 你就能获取到其中所有的类型,根据类型 ...

  8. ORACLE参数max_shared_servers空值与零的区别

    ORACLE数据库中的参数max_shared_servers,这是一个DBA很熟悉的参数,但是这个参数max_shared_servers为空值与为0有区别吗?这个细节可能很多人都没有注意过.如下所 ...

  9. 使用multi-paxos实现日志同步应用

    paxos 说multi-paxos之前先简要说一下paxos paxos是在多个成员之间对某个值(提议)达成一致的一致性协议.这个值可以是任何东西.比如多个成员之间进行选主,那么这个值就是主的身份. ...

  10. MYSQL多实例配置方法 mysqld_multi方法

    在实际的开发过程中,可能会需要在一台服务器上部署多个MYSQL实例,那建议使用MYSQL官方的解决方案 mysqld_multi 1.修改my.cnf 如一个定义两个实例的参考配置: [mysqld_ ...