本帖最后由 瘦网虫 于 2016-10-1 14:57 编辑
新人写红外发射测试代码的时候,最好用空调、电视等等用标准格式发送的红外来测试。
可是碰到解析出来的代码类型是UNKNOWN,长度为一个32位的代码,再通过sendNEC,sendSony,sendRC5,sendRC6怎么都不成功?遇到过吗?数字电视机顶盒的遥控器出来的就是这样的东东。
例子:irsend.sendRC6(0x30D0000A, 32);
如果你在找这个解决方法,在这里就对了。
先看看IRemote库里面的这段代码,(你也可以不看) - long IRrecv::decodeHash(decode_results *results) {
- // Require at least 6 samples to prevent triggering on noise
- if (results->rawlen < 6) {
- return ERR;
- }
- long hash = FNV_BASIS_32;
- for (int i = 1; i+2 < results->rawlen; i++) {
- int value = compare(results->rawbuf[i], results->rawbuf[i+2]);
- // Add value into the hash
- hash = (hash * FNV_PRIME_32) ^ value;
- }
- results->value = hash;
- results->bits = 32;
- results->decode_type = UNKNOWN;
- return DECODED;
- }
复制代码
看不懂,没关系,我也看不懂,但是里面提到了个hash,赶紧搜一下。
懒得搜的点这里
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
上面的例子里面“0x30D0000A”是经过一个hash函数变换过后得到的,原始的数据类似这样:
3550 ,1800 ,350 ,400 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,1400 ,300 ,400 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,1400 ,300 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,350 ,1400 ,350 ,350 ,400 ,350 ,350 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,400 ,1350 ,350 ,350 ,400 ,350 ,400 ,350 ,350 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,400 ,350 ,350 ,1400 ,350 ,350 ,400 ,350 ,350 ,1400 ,350 ,1350 ,350 ,1350 ,350 ,350 ,400 ,350 ,400
原始数据怎么得到的?看IRemote库里面的例子代码IRrecvdump和IRrecord,里面帮你通过串口打印出来这些数据了。
要想发送成功,不能发送“0x30D0000A”,要发送原始数据,通过sendRaw函数发送。
irsend.sendRaw(rawCodes, codeLen, 38);
rawCodes就是上面的原始数据,codeLen是这个原始数据的长度,38是38khz的意思。
- //定义下原始数据
- unsigned int rawCodes_num9[100] = {
- 3550 ,1800 ,350 ,400 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,1400 ,300 ,400 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,1400 ,300 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,350 ,1400 ,350 ,350 ,400 ,350 ,350 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,400 ,1350 ,350 ,350 ,400 ,350 ,400 ,350 ,350 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,400 ,350 ,350 ,1400 ,350 ,350 ,400 ,350 ,350 ,1400 ,350 ,1350 ,350 ,1350 ,350 ,350 ,400 ,350 ,400
- };
- //发送时使用下面的语句测试
- irsend.sendRaw(rawCodes_num9, 100, 38);
复制代码
GOOD LUCK~
解决问题系列(3)——红外发射,控制美的空调开
解决问题系列(1)——红外发射管 |