家里好几个海尔空调,遥控器如下。它们协议并不相同,所以空调之间有的功能部分相通,有的完全不通。其中有一个YR-M13看起来跟淘来的YR-M10相似,但是很不幸。协议也是不一样的。
看了前辈写的贴
1、解读海尔壁挂空调红外遥控编码之我见,有源码啊!http://bbs.mydigit.cn/read.php?tid=1152024
2、海尔空调遥控编码分析http://bbs.mydigit.cn/read.php?tid=2637581
Luckily,第一篇讲的就是YR-M10的协议讲解。细致入微。打印下来依次验证
写个解码的类
IRDataPkg.h
#ifndef _C_IRDATAPKG_H_
#define _C_IRDATAPKG_H_
#pragma once
class IRDataPkg
{
public:
int pkgLen ;
unsigned char *buf ;
IRDataPkg( void);
~IRDataPkg(void);
//校验字节
unsigned char checkCrc(); // 1 0校验求和
unsigned char first();//==0xA5// 1 0
unsigned char dataok();//first()&&checkCrc()
unsigned char temperature(); //温度16-30
unsigned char button();//power状态0关1开2模式3风速4?5?6上箭头7下箭头8睡眠9设定10?11电热12健康13聪明风
unsigned char wind_direction_v();//聪明风0关1上2下3摆
unsigned char wind_speed();//0自动,3低 2中 1高
unsigned char time_hh();//0-23
unsigned char time_mm();//0-59
unsigned char health();//0关1开
unsigned char quiet();//==
unsigned char sleep();//0关1开
unsigned char mode();//0关1
unsigned char electric_heat();//0关1
void writeArrayToBuf(unsigned char arr[],unsigned int len);
void writeToBuf(unsigned char byt, unsigned int id);
};
#endif // _C_IRDATAPKG_H_
IRDataPkg.cpp
#include "IRDataPkg.h"
IRDataPkg::IRDataPkg() {
this->pkgLen = 9;
this->buf = new unsigned char[pkgLen];//[0 for i in range(.bufLen)];
for (int i = 0; i < this->pkgLen - 1; i++) {
this->buf[i] = 0;
}
}
IRDataPkg::~IRDataPkg() {
delete []buf;
}
//校验和
unsigned char IRDataPkg::checkCrc() {
unsigned char r = 0;
//计算和
for (int i = 0; i < this->pkgLen - 1; i++) {
r += this->buf[i];
}
r = r & 0xff;
return r == buf[this->pkgLen - 1] ? 1 : 0;
}
unsigned char IRDataPkg::first() {
return 0xA5 == buf[0] ? 1 : 0;
}
unsigned char IRDataPkg::dataok() {
return (this->first()==1 && this->checkCrc()==1) ? 1 : 0;
};//first()&&checkCrc()
unsigned char IRDataPkg::temperature() {
return (buf[1] >> 4) + 16; //温度16-30
}
unsigned char IRDataPkg::button() {
return (buf[1] & 0x0f);
}//power状态0关1开2模式3风速4?5?6上箭头7下箭头8睡眠9设定10?11电热12健康13聪明风
unsigned char IRDataPkg::wind_direction_v() {
return (buf[2] >> 6) & 0x03; //聪明风0关1上2下3摆
}
unsigned char IRDataPkg::wind_speed() {
return (buf[5] >> 6) & 0x03; //0自动,3低 2中 1高
}
unsigned char IRDataPkg::time_hh() {
return (buf[2] & 0x1f); //0-23
}
unsigned char IRDataPkg::time_mm() {
return (buf[3] & 0x3f); //0-59
}
unsigned char IRDataPkg::health() {
return (buf[4] >> 5) & 0x01; //0关1开
}
unsigned char IRDataPkg::quiet() {
return (buf[7] >> 6) & 0x01;
} //==睡眠
unsigned char IRDataPkg::sleep() {
return (buf[7] >> 6) & 0x01; //0关1开
}
unsigned char IRDataPkg::mode() {
return (buf[6] >> 5);
}//0三角1雪花2水滴3太阳4风扇
unsigned char IRDataPkg::electric_heat(){
return ((buf[4] >> 6) & 0x03)?1:0; //0关1开
}
void IRDataPkg::writeToBuf(unsigned char byt, unsigned int id){
if(id<this->pkgLen){
this->buf[id]=byt;
}
}
void IRDataPkg::writeArrayToBuf(unsigned char arr[], unsigned int len) {
for (int i = 0; i < len; i++) {
this->writeToBuf(arr[i], i);
}
}
//*/