查看: 3426|回复: 0

基于GD32F450的红外解码--上位机篇

[复制链接]
  • TA的每日心情

    2023-7-25 22:49
  • 签到天数: 385 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2017-6-12 23:53:27 | 显示全部楼层 |阅读模式
    分享到:
    上位机的主要任务就是根据下位机传过来的红外数据画出红外波型图,解析出红外数据。我们这里只解析NEC协议数据。
    实际效果图如下:
    QQ截图20170612234910.png
    解码的核心代码如下:
    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) < 200)
    95.                 {
    96.                     //0.56ms低电平和0.56ms高电平 代表 0
    97.                     if (Math.Abs(d2.LevelSpan - DATA_LOW_SPAN) < 200)
    98.                         return 0;
    99.                     //0.56ms低电平,1.6ms高电平 代表 1
    100.                     if (Math.Abs(d2.LevelSpan - DATA_HIGH_SPAN) < 200)
    101.                         return 1;
    102.                 }
    103.             }
    104.             return -1;
    105.         }
    106.         #endregion
    107.     }
    108. }
    复制代码
    上位机使用C#语言编写,因为C#有强大的类库,可以处理好多东西。而且使用GDI+也比较方便。
    大家有什么问题可以跟贴讨论。



    回复

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-12-25 22:31 , Processed in 0.120797 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.