查看: 4299|回复: 8

[原创] 【LPC800项目】红外分析仪(4)

[复制链接]
  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2016-12-7 22:34:58 | 显示全部楼层 |阅读模式
    本帖最后由 党国特派员 于 2016-12-8 17:26 编辑

            有好些日子没更新了,不是不想更新,而是一直在弄红外分析仪的上位机,上位机的难点部分再发绘制红外数据的波形,要做到波形的放大缩小,波形数据的拖动。刚开始的时候,我是用一个特别大的位图来做波形的拖动,可是数据多了,位图也抗不住,window下的位图,最大的位图都给撑爆了,我16G内存已经报内存不足了,实在是没法满足要求,所以只有自己经过计算也显示波形和进行拖动。这一版终于完工了。实现了波形数据的绘制,放大、缩小、左右拖动。红外数据的解码等功能。
            大家还是先看图吧,比较直观。
    下位机的照片来两张
    IMG_20161207_210627.jpg IMG_20161207_210649.jpg
    这个电路比较简单。
    然后是上位机捕获的红外数据波形图
    QQ图片20161207221508.png
    对波形进行放大解码
    QQ图片20161207210515.png
    上面的是对NEC协议的解码结果:00FF18E7 。
    分解下:00 是遥控器的地址码,FF是地址码的反码,
    18是遥控按键数据,二进制格式为:00011000
    E7是按键数据反码,二进制格式为:11100111
    从上面来看解码是完全正确的。
    红外演示视频:


    下面是把解码部分的核心代码放出来(c#版)。
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;

    6. namespace IR.Protocol.Middleware
    7. {
    8.     /// <summary>
    9.     /// 缺省使用NEC协议解码
    10.     /// </summary>
    11.     public class DefaultProtocolMiddleware : InfraredProtocolMiddleware
    12.     {
    13.         public DefaultProtocolMiddleware(InfraredProtocolMiddleware next) : base(next) { }

    14.         public override Task<uint[]> Decoding(InfraredDataType[] IrDat)
    15.         {
    16.             return Task.FromResult<uint[]>(DecodingIRData(IrDat).ToArray());
    17.         }

    18.         #region 私有常量
    19.         private const int BOOT_LOW_SPAN = 9000;
    20.         private const int BOOT_HIGH_SPAN = 4500;
    21.         private const int DATA_LOW_SPAN = 560;
    22.         private const int DATA_HIGH_SPAN = 1600;
    23.         #endregion

    24.         #region 私有方法
    25.         /// <summary>
    26.         /// 获取红外解码数据
    27.         /// </summary>
    28.         /// <returns></returns>
    29.         private IList<uint> DecodingIRData(InfraredDataType[] IrDat)
    30.         {
    31.             IList<uint> result = new List<uint>();
    32.             Queue<InfraredDataType> IrQueue = new Queue<InfraredDataType>(IrDat);
    33.             while (true)
    34.             {
    35.                 if (IrQueue.Count < 10)
    36.                     break;
    37.                 var d1 = IrQueue.Dequeue();
    38.                 var d2 = IrQueue.Peek();
    39.                 //定位引导码
    40.                 if (SearchBootCode(d1, d2))
    41.                 {
    42.                     uint codeResult = 0;
    43.                     IrQueue.Dequeue();
    44.                     for (int i = 0; i < 32; i++)
    45.                     {
    46.                         if (IrQueue.Count < 32)
    47.                         {
    48.                             codeResult = 0;
    49.                             break;
    50.                         }
    51.                         d1 = IrQueue.Dequeue();
    52.                         d2 = IrQueue.Dequeue();
    53.                         //解码数据
    54.                         var val = DecodeIrData(d1, d2);
    55.                         if (val == -1)
    56.                         {
    57.                             codeResult = 0;
    58.                             break;
    59.                         }

    60.                         codeResult <<= 1;
    61.                         codeResult += (uint)val;
    62.                     }
    63.                     if (codeResult != 0)
    64.                         result.Add(codeResult);
    65.                 }
    66.             }
    67.             return result;
    68.         }

    69.         /// <summary>
    70.         /// 搜索引导码
    71.         /// </summary>
    72.         /// <param name="d1">数据1</param>
    73.         /// <param name="d2">数据2</param>
    74.         /// <returns>搜索成功返回 true</returns>
    75.         /// <remarks>NEC协议:9ms低电平,4.5ms高电平 是引导码</remarks>
    76.         bool SearchBootCode(InfraredDataType d1, InfraredDataType d2)
    77.         {
    78.             var c1 = Math.Abs(d1.LevelSpan - BOOT_LOW_SPAN) <= 200;
    79.             var c2 = Math.Abs(d2.LevelSpan - BOOT_HIGH_SPAN) <= 200;
    80.             return (d1.IsLow() && d1.IsHigh() && c1 && c2);
    81.         }

    82.         /// <summary>
    83.         /// 解码波形数据
    84.         /// </summary>
    85.         /// <param name="d1">数据1</param>
    86.         /// <param name="d2">数据2</param>
    87.         /// <returns>成功:返回0或1 失败返回-1</returns>
    88.         /// <remarks>NEC协议:0.56ms低电平和0.56ms高电平为0,0.56ms低电平和1.6ms高电平为1</remarks>
    89.         private int DecodeIrData(InfraredDataType d1, InfraredDataType d2)
    90.         {
    91.             //判断d1为代电平,d2为高电平
    92.             if (d1.IsLow() && d2.IsHigh())
    93.             {
    94.                 if (Math.Abs(d1.LevelSpan - DATA_LOW_SPAN) < 300)
    95.                 {
    96.                     //0.56ms低电平和0.56ms高电平 代表 0
    97.                     if (Math.Abs(d2.LevelSpan - DATA_LOW_SPAN) < 300)
    98.                         return 0;
    99.                     //0.56ms低电平,1.6ms高电平 代表 1
    100.                     if (Math.Abs(d2.LevelSpan - DATA_HIGH_SPAN) < 300)
    101.                         return 1;
    102.                 }
    103.             }
    104.             return -1;
    105.         }
    106.         #endregion
    107.     }
    108. }
    复制代码

    基本上实现了红外解码的所有功能,解码采用中间件的思想,目前只实现了NEC协议的中间件,以后会加入更多的解码协议。工程不会再有大的改动。

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-10-15 13:16
  • 签到天数: 191 天

    连续签到: 1 天

    [LV.7]常住居民III

    11

    主题

    664

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1722
    最后登录
    2017-10-15
    发表于 2016-12-7 23:17:43 | 显示全部楼层
    官方有库函数直接调用的吗?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
     楼主| 发表于 2016-12-7 23:19:39 | 显示全部楼层
    jackten 发表于 2016-12-7 23:17
    官方有库函数直接调用的吗?

    你的库函数是指什么?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7909
    最后登录
    2025-4-11
    发表于 2016-12-7 23:52:42 来自手机 | 显示全部楼层
    厉害了   
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-2-12 15:48
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    425

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1084
    最后登录
    2018-2-12
    发表于 2016-12-8 08:44:01 | 显示全部楼层
    牛人一枚,向你学习
    不知道大家放假了吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-10-15 13:16
  • 签到天数: 191 天

    连续签到: 1 天

    [LV.7]常住居民III

    11

    主题

    664

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1722
    最后登录
    2017-10-15
    发表于 2016-12-8 09:56:28 | 显示全部楼层
    党国特派员 发表于 2016-12-7 23:19
    你的库函数是指什么?

    就是各种外设的驱动库           
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2022-6-3 10:27
  • 签到天数: 131 天

    连续签到: 1 天

    [LV.7]常住居民III

    19

    主题

    519

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1620
    最后登录
    2022-6-26
    发表于 2016-12-8 10:08:22 | 显示全部楼层
    同款面包板
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
     楼主| 发表于 2016-12-8 15:09:29 | 显示全部楼层
    jackten 发表于 2016-12-8 09:56
    就是各种外设的驱动库

    下位机使用mBed开发。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
    发表于 2016-12-13 13:26:36 | 显示全部楼层
    谢谢分享,厉害
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-5 06:15 , Processed in 0.110673 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表