现在的位置: 首页资讯>正文
基于GD32F450的红外解码—上位机解决方案
2017年06月13日 作者: 暂无评论 78+ 0

GD32F450的红外解码

上位机的主要任务就是根据下位机传过来的红外数据画出红外波型图,解析出红外数据。我们这里只解析NEC协议数据。

实际效果图如下:

效果图

解码的核心代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IR.Protocol.Middleware
{
/// <summary>
/// 缺省使用NEC协议解码
/// </summary>
public class DefaultProtocolMiddleware : InfraredProtocolMiddleware
{
public DefaultProtocolMiddleware(InfraredProtocolMiddleware next) : base(next) { }

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

#region 私有常量
private const int BOOT_LOW_SPAN = 9000;
private const int BOOT_HIGH_SPAN = 4500;
private const int DATA_LOW_SPAN = 560;
private const int DATA_HIGH_SPAN = 1600;
#endregion

#region 私有方法
/// <summary>
/// 获取红外解码数据
/// </summary>
/// <returns></returns>
private IList<uint> DecodingIRData(InfraredDataType[] IrDat)
{
IList<uint> result = new List<uint>();
Queue<InfraredDataType> IrQueue = new Queue<InfraredDataType>(IrDat);
while (true)
{
if (IrQueue.Count < 10)
break;
var d1 = IrQueue.Dequeue();
var d2 = IrQueue.Peek();
//定位引导码
if (SearchBootCode(d1, d2))
{
uint codeResult = 0;
IrQueue.Dequeue();
for (int i = 0; i < 32; i++)
{
if (IrQueue.Count < 32)
{
codeResult = 0;
break;
}
d1 = IrQueue.Dequeue();
d2 = IrQueue.Dequeue();
//解码数据
var val = DecodeIrData(d1, d2);
if (val == -1)
{
codeResult = 0;
break;
}

codeResult <<= 1;
codeResult += (uint)val;
}
if (codeResult != 0)
result.Add(codeResult);
}
}
return result;
}

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

/// <summary>
/// 解码波形数据
/// </summary>
/// <param name="d1">数据1</param>
/// <param name="d2">数据2</param>
/// <returns>成功:返回0或1 失败返回-1</returns>
/// <remarks>NEC协议:0.56ms低电平和0.56ms高电平为0,0.56ms低电平和1.6ms高电平为1</remarks>
private int DecodeIrData(InfraredDataType d1, InfraredDataType d2)
{
//判断d1为代电平,d2为高电平
if (d1.IsLow() && d2.IsHigh())
{
if (Math.Abs(d1.LevelSpan - DATA_LOW_SPAN) < 200)
{
//0.56ms低电平和0.56ms高电平 代表 0
if (Math.Abs(d2.LevelSpan - DATA_LOW_SPAN) < 200)
return 0;
//0.56ms低电平,1.6ms高电平 代表 1
if (Math.Abs(d2.LevelSpan - DATA_HIGH_SPAN) < 200)
return 1;
}
}
return -1;
}
#endregion
}
}

上位机使用C#语言编写,因为C#有强大的类库,可以处理好多东西。而且使用GDI+也比较方便。

详情可访问:[GD32F450方案分享] 基于GD32F450的红外解码--上位机篇

原文链接:http://www.eeboard.com/news/gd32f450-4/

搜索"爱板网"加关注,每日最新的开发板、智能硬件、开源硬件、活动等信息可以让你一手全掌握。推荐关注!

【微信扫描下图可直接关注】

toaal

科技早知道:

研究人员发现了专门针对树莓派的Linux恶意软件来进行虚拟货币的挖矿行为

Intel Core-X出货价泄露:卖一颗最多赚30美元

共享单车大战:无线充电还需努力

机械硬盘会被SSD吞食?希捷怎么辩解

骁龙836处理器曝光:主频提高 Galaxy Note 8首发

  

相关文章

动力强劲、高端利器——GD32 Colibri-F450VE开发板评测
gd32f450redboard-21

从最近几年的电子行业趋势来看,国内的半导体产业发展迅猛,不少企业都打出了自己的明星产品。今天要谈的这个产品就是来自兆易创新最新的基于ARM Cortex-M4处理器系列的微控制器——GD32 Colib...

大陆又一颗Cortex-M4微控制器问世——性能更强大,功能更丰富的GD32450i-EVAL评估板首发体验
SONY DSC

俗话说“赶早不如赶巧”,3年前,兆易创新从Flash杀入到MCU领域,或许在业界并没有多少人看好,而3年后的今天,兆易创新的Cortex-M3系列微控制器,已经可以媲美甚至超越同系列的ST微控制器,用...

给我留言

您必须 [ 登录 ] 才能发表留言!