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

(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. 一款简洁大气的jquery日期日历插件

    本jquery插件名为manhuaDate,暂时只支持jquery 1.9.0以下版本,比如jquery-1.8.3.min.js 查看效果网址:http://keleyi.com/a/bjad/em ...

  2. MSSQL 分页

    使用数据库分页返回用户数据有如下好处:1.减少服务器磁盘系统地读取压力2.减少网络流量,减轻网络压力3.减轻客户端显示数据的压力4.提高处理效率. 一般而言分页处理分为两种:应用程序中的分页(查询出所 ...

  3. iOS之常用宏定义

    下面我为大家提供一些常用的宏定义! 将这些宏定义 加入到.pch使用 再也不用 用一次写一次这么长的程序了 //-------------------获取设备大小------------------- ...

  4. IOS开发基础知识--碎片28

    1:通用的weakify和strongify /** * 强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题 * 调用方式: `@weakify_self`实现弱引用转换,` ...

  5. MySQL的数据库与表格创建

    打开MySQL: 1.进入终端输入:cd /usr/local/mysql/bin/ 2.回车后 登录管理员权限 sudo su 3.回车后输入以下命令来禁止mysql验证功能 ./mysqld_sa ...

  6. SQL Server快捷键

    SQL Server快捷键 金刚 SQL Server 快捷键 自己汇总的键盘操作快捷键 F7 切换到对象资源管理器 F5 执行T-Sql语句 F6 跳转到列属性 Alt+Enter 表属性 其实还有 ...

  7. netstat监控大量ESTABLISHED连接与Time_Wait连接问题

    问题描述: 在不考虑系统负载.CPU.内存等情况下,netstat监控大量ESTABLISHED连接与Time_Wait连接. # netstat -n | awk '/^tcp/ {++y[$NF] ...

  8. TFS源代码管理原则

    1.工作开始初次打开解决方案是应向服务器请求更新代码.2.工作结束时,应向服务器签入最新代码,并保证解决方案能够编译通过.3.不要长时间签出项目或解决方案,当向项目添加新项目后为编辑任何程序代码时,应 ...

  9. Linq专题之提高编码效率—— 第一篇 Aggregate方法

    我们知道linq是一个很古老的东西,大家也知道,自从用了linq,我们的foreach少了很多,但有一个现实就是我们在实际应用中使用到的却是屈指可数 的几个方法,这个系列我会带领大家看遍linq,好的 ...

  10. mysql5.7.1 zip版本安装记录

    很久没遇到使用mysql的项目了,今天下载了个,发现变了很多,搜索了下,发现按http://www.cnblogs.com/wenthink/p/MySQLInstall.html中提到的基本可以使用 ...