我是靠谱客的博主 踏实百褶裙,最近开发中收集的这篇文章主要介绍环保212协议(HJT 212-2017) 数据接收后的解码_C#实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、解码类代码:

using LogHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class HJ212_2017
{
    /// <summary>
    /// 数据帧头
    /// </summary>
    public string header { get; set; }
    /// <summary>
    /// 数据长度
    /// </summary>
    public string data_length { get; set; }

    /// <summary>
    /// 数据头
    /// </summary>
    public Dictionary<string, string> DATA_HEAD { get; set; }
    / <summary>
    / 数据内容
    / </summary>
    public Dictionary<string, string> CP { get; set; }
    /// <summary>
    /// CRC校验
    /// </summary>
    public string CRC { get; set; }


    public bool DecodeData(string Text)
    {
        try
        {
            Text = Text.ToUpper().Replace(";CP=", "").Replace(" ", "");//有些厂家协议不很标准,有的大小写不一致,此处强制转大写字母
            header = Text.Substring(0, 2);
            data_length = Text.Substring(2, 4);
            string[] data_0 = Text.Substring(6, Text.Length - 6).Split(new char[] { '&', '&' }, StringSplitOptions.RemoveEmptyEntries);
            string[] data_1 = data_0[0].Split(new char[] { ';' });
            DATA_HEAD = new Dictionary<string, string>();
            for (int h = 0; h < data_1.Length; h++)
            {
                string[] d_1 = data_1[h].Split(new char[] { '=' });
                DATA_HEAD.Add(d_1[0], d_1[1]);
            }
            string[] data_2 = data_0[1].Split(new char[] { ';' });
            CP = new Dictionary<string, string>();
            for (int i = 0; i < data_2.Length; i++)
            {
                string[] d_6 = data_2[i].Split(new char[] { ',' });
                for (int j = 0; j < d_6.Length; j++)
                {
                    string[] d_7 = d_6[j].Split(new char[] { '=' });
                    CP.Add(d_7[0], d_7[1]);
                }
            }
            CRC = data_0[2];
            return true;
        }
        catch (Exception)
        {
            //数据接收不完整
            LogApi.WriteLog("解码失败:数据有问题," + Text);
            //throw;
            return false;
        }
    }


    /// <summary>
    /// 判断数据是否通过校验
    /// </summary>
    /// <param name="Text">原始数据</param>
    /// <returns>是否通过</returns>
    public bool Crc16(string Text)
    {
        try
        {          
            string CRC = Text.Substring(Text.Length - 4, 4);
           
            Text = Text.Substring(Text.IndexOf("QN"));
            Text = Text.Substring(0, Text.Length - 4);                    

            byte[] bytes = Encoding.ASCII.GetBytes(Text);
            int crcRegister = 0xFFFF;
            for (int i = 0; i < bytes.Length; i++)
            {
                crcRegister = (crcRegister >> 8) ^ bytes[i];
                for (int j = 0; j < 8; j++)
                {
                    int check = crcRegister & 0x0001;
                    crcRegister >>= 1;
                    if (check == 0x0001)
                    {
                        crcRegister ^= 0xA001;
                    }
                }
            }
            string result = string.Format("{0:X}", crcRegister);//转十六进制
            for (int i = result.Length; i < 4; i++)//补足 4 位
            {
                result = "0" + result;
            }
            //LogApi.WriteLog("计算校验码:" + result);
            if (result == CRC)
            {
                return true;
            }
            else
            {
                LogApi.WriteLog("校验码有误:" + CRC);
                LogApi.WriteLog("待校验数据:" + Text);
                LogApi.WriteLog("计算校验码:" + result);
                return false;


            }
        }
        catch (Exception)
        {
            //数据接收不完整
            LogApi.WriteLog("数据校验:数据有问题," + Text);
            return false;
            //throw;
        }

    }
}

2、数据【hj212_data】接收后解码调用:

HJ212_2017 hj212 = new HJ212_2017();

if(!hj212.Crc16(hj212_data) || !hj212.DecodeData(hj212_data)) //未通过验证或解码失败
{
     return; //不解码
}  
                      
string CN = hj212.DATA_HEAD["CN"];          //数据类型
string MN = hj212.DATA_HEAD["MN"];          //设备MN

string DATATIME = hj212.CP["DATATIME"];     //上报时间


string AVOC01_RTD = hj212.CP["AVOC01-RTD"]; //voc实时值
string AVOC01_COU = hj212.CP["AVOC01-COU"]; //voc历史累计值
string AVOC01_MAX = hj212.CP["AVOC01-MAX"]; //voc历史最大值
string AVOC01_MIN = hj212.CP["AVOC01-MIN"]; //voc历史最小值
string AVOC01_AVG = hj212.CP["AVOC01-AVG"]; //voc历史平均值

string AVOC01_FLAG = hj212.CP["AVOC01-FLAG"];      //设备状态

......

最后

以上就是踏实百褶裙为你收集整理的环保212协议(HJT 212-2017) 数据接收后的解码_C#实现的全部内容,希望文章能够帮你解决环保212协议(HJT 212-2017) 数据接收后的解码_C#实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部