arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法
最近在调试红外遥控格力空调,在论坛中学到了不少东西。参考:
调试环境:
软件: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函数溢出问题及其解决方法的更多相关文章
- zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...
- Arduino红外遥控系列教程2013——红外转码
教程三:红外转码教程——用电视遥控器取代机顶盒遥控器 前言前段时间看到了使用红外遥控的X-Bot机器人[链接],感觉很有意思.最近开始玩Arduino与红外,一方面打算将来用于BOXZ的之间的通讯控制 ...
- 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
[导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...
- 关于swift语言中导入OC三方类找不到头文件的解决方法
首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...
- 在Springmvc普通类@Autowired注入request为null解决方法
在Springmvc普通类@Autowired注入request为null解决方法 在类中加入以下注入request对象的代码,运行时发现request为null,注入失败.在@Controlle ...
- Arduino红外遥控系列教程2013——发射与接收
教程一:红外接收教程本教程共四步操作,将教大家如何收集电视红外遥控器的编码 视频链接:http://v.youku.com/v_show/id_XNTE2NjQ5NTcy.html 第一步:电路连接, ...
- Netty handler处理类无法使用@Autowired注入bean的解决方法
问题由来: 公司有个项目用到netty作为websocket的实现,最近打算部署双机,这使得原来在内存中的保存Channel信息的方案不再可行,需要转移到redis中,改造过程中发现通过@Autowi ...
- python实用小技巧自问自答系列(一):查看类中函数文档doc的方法
问题:如何查看某个类的方法文档说明或者是函数的参数列表情况? 答: 方法一:直接在需要查询的方法后面加上".__doc__"即可以打印出该方法的文档说明(需要先导入该方法所属模块) ...
- [转]动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
本文转自:http://blog.csdn.net/limlimlim/article/details/8647038 [导读]ServiceDescriptionImporter是创建Web Ser ...
随机推荐
- js 模块化的一些理解和es6模块化学习
模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理 5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式( ...
- 前端弹出对话框 js实现 ajax交互
原本计划实现这样一个需求: 前台点击触发某业务动作,需要用户补充信息,不做跳转页面,弹窗的形式进行补充信息. 折腾出来了,但是最终没有用到. 代码还有些毛躁,提供大概实现逻辑. 实现思路: 在窗口铺上 ...
- H5学习
1.html{font-size:62.5%;}//不用font-size:10px的原因:(因为设了62.5%后就有1rem = 10px,便于用rem来指定元素的尺寸,这样响应式的时候可以直接改变 ...
- spring.net (3)依赖注入基础2
如何调用其他对象的成员 接上文例子: 现在Person有一个属性 name 静态属性 eye 域 gender public class Person { public string name { ...
- iOS 获取用户授权的用户隐私保护-地图定位
获取用户授权的用户隐私保护地图定位示例://导入定位框架#import<CoreLocation/CoreLocation.h>@interfaceViewController()< ...
- IOS开发基础知识--碎片44
1:App跳转至系统Settings 跳转在IOS8以上跟以下是有区别的,如果是IOS8以上可以如下设置: NSURL *url = [NSURL URLWithString:UIApplicatio ...
- Android内存泄漏
Java是垃圾回收语言的一种,其优点是开发者无需特意管理内存分配,降低了应用由于局部故障(segmentation fault)导致崩溃,同时防止未释放的内存把堆栈(heap)挤爆的可能,所以写出来的 ...
- TortoiseSVN提交提示423 Locked的解决办法
往svn上提交文件时,文件可能被另一个人占用,这时提交就会报423Locked错误. 此办法是阅读官方文档(TortoiseSVN-1.6.16-zh_CN.pdf) 4.21 锁部分提供的办法: 首 ...
- Symantec Backup Exec 2012 Agent For Linux安装
Backup Exec 2012 介绍 Backup Exec 2012 是一种为虚拟和物理环境提供保护的集成产品,能够简化备份和灾难恢复,并提供了无可匹敌的恢复功能.借助于强大的 Symantec ...
- SQL SERVER 重组含有特殊字符的索引时遇到“关键字 'with' 附近有语法错误.”
案例描述 这是在索引重组过程中遇到的有意思的错误案例,搜索了一下也没有看到相关资料,估计我第一个碰到这类错误的人(It's just a joke).具体情况是YourSQLDba在做维护数据库索引时 ...