linux 红外 解析 代码,红外协议之NEC协议

本文揭示了解码NEC红外协议的关键在于一个小细节——循环中右移操作的时间调整。通过修正程序,避免了末尾位移带来的误差,使得解码更加精准。作者分享了编程中的教训:关注1位操作,特别是字节接收的左移或右移,以提升代码效率和准确性。
摘要由CSDN通过智能技术生成

NEC协议载波:38khz

其逻辑1与逻辑0的表示如图所示:

973ca57c1be2d74ea9aff9cb400b0709.png

逻辑1为2.25ms,脉冲时间560us;逻辑0为1.12ms,脉冲时间560us。所以我们根据脉冲时间长短来解码。推荐载波占空比为1/3至1/4。

NEC协议格式:

14de7a7e2516b9fa208a130c23ee17c7.png

首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit 的命令码(也是从低有效位开始发),而后也是8bit 的命令码的反码。

以上是一个正常的序列,但可能存在一种情况:你一直按着1个键,这样的话发送的是以110ms为周期的重复码,如下图:

5263da9f319410cc77a5068bf0277666.png

就是说,发了一次命令码之后,不会再发送命令码,而是每隔110ms时间,发送一段重复码。

1ecbc9b0feff470bae62a92ab8ce99cd.png

重复码由9ms高电平和2.25ms的低电平以及560us的高电平组成。

需要注意的是:1838红外一体接收头为了提高接受灵敏度。输入高电平,其输出的是相反的低电平。

搞了一个下午和晚上,NEC解码出来还是有点细微差错。查了很久,也没有收获。心里有点小郁闷。今早起来,仔细地看了看他人的参考代码。突然被下面一个小小的细节折服了。

请注意这段代码:

void hal_NEC_decode(uchar *addr,uchar *addrt,uchar *comm,uchar *commt)

{

uchar i,j,k;

uchar tmp1=0;

while(NECFinshFlag==0);

NECFinshFlag=0;

for(i=0,k=1;i<4;i=i+1)

{

for(j=1;j<=8;j++)

{

if(NECTimerTable[k++] > 7)

{

tmp1 |=0x80;

}

tmp1 >>=1;

}

switch(i)

{

case 0:*addr=tmp1;break;

case 1:*addrt=tmp1;break;

case 2:*comm=tmp1;break;

case 3:*commt=tmp1;break;

}

tmp1=0;

}

}

最后tmp1的值是被右移了1位。所以改为下代码

void hal_NEC_decode(uchar *addr,uchar *addrt,uchar *comm,uchar *commt)

{

uchar i,j,k;

uchar tmp1;

while(NECFrameFlag==0);

NECFrameFlag=0;

for(i=0,k=1;i<4;i=i+1)

{

tmp1=0;

for(j=0;j<8;j++)

{

tmp1 >>=1;//事先右移一位,防止最后一次循环的出错

if(NECTimerTable[k++] >8)

{

tmp1 |=0x80;

}

}

switch(i)

{

case 0:*addr=tmp1;break;

case 1:*addrt=tmp1;break;

case 2:*comm=tmp1;break;

case 3:*commt=tmp1;break;

}

}

}

仅仅修改了这么一个代码顺序,程序就能比较完美的解析NEC协议来了。可见写程序,小小的细节也是非常重要,可能会牵扯到整个的成功。

总结:以后编写按1bit(不管是从LSB还是MSB开始)接收组成一个字节的程序,要格外的注意循环左移或者右移的情况。实现将临时变量移动一下,免得最后1位还需要移动而造成的错误。

最后附上NEC协议的命令码(市面上常见的遥控板)

3f3d5191dfd0ace1923220c8fbe78b52.png

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值