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 ...
随机推荐
- 熟悉vs2012IDE
使用vs2012已经几个月了,深感对开发环境的学习有助于提高开发的效率.现将我的经验总结如下: 一.搜索 vs2012相比vs2010添加了正则搜索,极大的提高了代码的查询效率. 二.重构 同vs20 ...
- jQuery静态方法noConflict的使用和源码分析
所谓静态方法是jQuery本身得公共方法,并不需要通过实例化来调用,一般也称为工具方法,下面先来列绝下jQuery.noConflict方法的用法: noConflict() 方法让渡变量 $ 的 j ...
- 前端弹出对话框 js实现 ajax交互
原本计划实现这样一个需求: 前台点击触发某业务动作,需要用户补充信息,不做跳转页面,弹窗的形式进行补充信息. 折腾出来了,但是最终没有用到. 代码还有些毛躁,提供大概实现逻辑. 实现思路: 在窗口铺上 ...
- Ionic + Cordova 跨平台移动开发环境配置
1.下载安装JDK(根据各自系统选择32位或64位下载),安装完成之后需要做以下环境变量配置 在“系统变量”中,设置3象属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),如果已经 ...
- iOS UITabBarController的使用
UITabBarController 和 UINavigationController 几乎是iOS APP的标配. UITabBarController分栏(标签栏)控制器, 和UINavigati ...
- 委托的N种写法,你喜欢哪种?
一.委托调用方式 1. 最原始版本: delegate string PlusStringHandle(string x, string y); class Program { static void ...
- AFNetworking的封装
AFNetworking的封装 特点 1.将AFNetworking 3.0封装.能够很好享受苹果开发中的面向对象开发思想 . 2.其中也提供几种方法,来请求数据.包括:GET请求/POST请求/Up ...
- React Native常用组件Image使用
前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...
- IOS开发基础知识--碎片22
1:设置有间距的表格行(UITableViewStyleGrouped) .设置section的数目,即是你有多少个cell - (NSInteger)numberOfSectionsInTableV ...
- GamePinTu
package com.example.administrator.pintu; import android.content.Context; import android.graphics.Bit ...