• 红外协议之NEC协议


    NEC协议载波:38khz

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

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

    NEC协议格式:

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

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

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

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

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

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

    请注意这段代码:

    复制代码
     1 void hal_NEC_decode(uchar *addr,uchar *addrt,uchar *comm,uchar *commt)
     2 {
     3     uchar i,j,k;
     4     uchar tmp1=0;
     5 
     6     while(NECFinshFlag==0);
     7     NECFinshFlag=0;
     8 
     9     for(i=0,k=1;i<4;i=i+1)
    10     {
    11         for(j=1;j<=8;j++)
    12         {
    13             if(NECTimerTable[k++] > 7)
    14             {
    15                 tmp1 |=0x80;
    16             }
    17             tmp1 >>=1;
    18         }
    19         switch(i)
    20         {
    21             case 0:*addr=tmp1;break;
    22             case 1:*addrt=tmp1;break;
    23             case 2:*comm=tmp1;break;
    24             case 3:*commt=tmp1;break;
    25         }
    26         tmp1=0;
    27     }
    28 }
    复制代码

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

    复制代码
     1 void hal_NEC_decode(uchar *addr,uchar *addrt,uchar *comm,uchar *commt)
     2 {
     3     uchar i,j,k;
     4     uchar tmp1;
     5 
     6     while(NECFrameFlag==0);
     7     NECFrameFlag=0;
     8 
     9     for(i=0,k=1;i<4;i=i+1)
    10     {    
    11         tmp1=0;
    12         for(j=0;j<8;j++)
    13         {    
    14             tmp1 >>=1;//事先右移一位,防止最后一次循环的出错
    15             if(NECTimerTable[k++] >8)
    16             {
    17                 tmp1 |=0x80;
    18             }    
    19         }
    20         switch(i)
    21         {
    22             case 0:*addr=tmp1;break;
    23             case 1:*addrt=tmp1;break;
    24             case 2:*comm=tmp1;break;
    25             case 3:*commt=tmp1;break;
    26         }        
    27     }
    28 }
    复制代码

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

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

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

  • 相关阅读:
    CEIWEI CommTone串口调试精灵7.1 串口调试 串口工具
    CEIWEI USBMonitor USB监控精灵 v2.3.2 USB过滤驱动 USB监控
    CommMonitor8.0 串口过滤驱动 SDK DLL版本 C#/Delphi调用DEMO
    CommMonitor10.0.3串口过滤工具(serial port monitor)
    (1)、JEasyUI 之 Datagrid的Combobox 显示 textField 值的问题
    button 使用 flex 布局的兼容性问题
    探索 Reflect.apply 与 Function.prototype.apply 的区别
    awk 输出前 N 列的最简单方法
    在 Ubuntu 18.04 下安装 fcitx 及搜狗拼音输入法
    禁用 Gnome Shell 默认的 Ubuntu Dock 和 Ubuntu AppIndicators 扩展
  • 原文地址:https://www.cnblogs.com/adylee/p/7389485.html
Copyright © 2020-2023  润新知