Exemplo n.º 1
0
        /// <summary>
        /// 合并多个帧
        /// </summary>
        /// <param name="packages"></param>
        /// <returns></returns>
        public static Package Combine(params Package[] packages)
        {
            if (packages.Length == 0)
            {
                throw new ArgumentNullException("参数错误");
            }

            List <Package> list    = packages.ToList();
            Package        package = packages[0];
            List <byte>    t       = new List <byte>();

            if (list.Exists(obj => !obj.IsFinal))//数据帧分多帧情况
            {
                var q = from p in list
                        orderby p.DataNum
                        select p;
                int num = 1;
                foreach (var item in q)
                {
                    if (item.DataNum != num)
                    {
                        throw new Exception(string.Format("缺少第{0}帧", num));
                    }
                    for (int i = 3; i < item.DataLength; i++)
                    {
                        t.Add(item.Data[i]);
                    }
                    num++;
                }
                if (!list.Exists(obj => obj.IsFinal))
                {
                    throw new Exception("缺少结束帧");
                }
            }
            else//普通帧
            {
                foreach (var item in packages)
                {
                    if (!item.IsFinal)
                    {
                        foreach (var subItem in item.Data)
                        {
                            t.Add(subItem);
                        }
                    }
                }
            }
            package.data = t.ToArray();
            package.CS   = package.CreateCS();
            return(package);
        }
Exemplo n.º 2
0
        public static bool IsEndByte(byte[] bytes, out string error)
        {
            error = "";
            if (bytes == null || bytes.Length == 0)
            {
                error = "参数不正确";
            }
            Package package = new Package();

            if (bytes == null || bytes.Length < 12)
            {
                error = "数据帧不完整";
            }

            int start = 0;

            for (int i = 0; i < bytes.Length - 5; i++)
            {
                if (bytes[start] == PackageDefine.BeginByte && bytes[start + 5] == PackageDefine.BeginByte)
                {
                    start = i;
                    break;
                }
            }

            if (bytes[start + 0] != PackageDefine.BeginByte)
            {
                error = "未找到帧头";
            }

            package.ID3 = bytes[start + 1];
            package.ID2 = bytes[start + 2];
            package.ID1 = bytes[start + 3];
            package.ID0 = bytes[start + 4];
            //package.DevID = id3 * 16 * 16 * 16 + id2 * 16 * 16 + id1 * 16 + id0;

            if (bytes[start + 5] != PackageDefine.BeginByte)
            {
                error = "数据帧不完整或已损坏";
            }

            //控制码
            package.C0 = bytes[start + 6]; //控制码
            package.C1 = bytes[start + 7]; //功能码

            //数据长度
            package.L0 = bytes[start + 8];
            package.L1 = bytes[start + 9];

            package.data = new byte[package.DataLength];
            if (bytes.Length - PackageDefine.MinLenth != package.DataLength)
            {
                error = "数据长度和数据不匹配";
            }
            for (int i = 0; i < package.DataLength; i++)
            {
                package.data[i] = bytes[start + 10 + i];
            }

            package.CS = bytes[bytes.Length - 2];//校验码

            if (bytes[bytes.Length - 1] != PackageDefine.EndByte)
            {
                error = "数据帧不完整或已损坏";
            }

            if (Package.CreateCS(package) != package.CS)
            {
                error = "数据帧校验失败";
            }

            return(error == "");
        }
Exemplo n.º 3
0
        /// <summary>
        /// 通过指定的Byte[]数组创建帧
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public static Package FromBytes(byte[] bytes)
        {
            if (bytes == null || bytes.Length == 0)
            {
                throw new ArgumentException("数据为空");
            }
            Package package = new Package();

            if (bytes.Length < 12)
            {
                throw new ArgumentException("数据帧长度低于最短帧");
            }
            if (bytes[0] != PackageDefine.BeginByte)
            {
                throw new ArgumentException("未能在开始位找到帧头");
            }

            package.ID3 = bytes[1];
            package.ID2 = bytes[2];
            package.ID1 = bytes[3];
            package.ID0 = bytes[4];
            //package.DevID = id3 * 16 * 16 * 16 + id2 * 16 * 16 + id1 * 16 + id0;

            if (bytes[5] != PackageDefine.BeginByte)
            {
                throw new ArgumentException("数据帧不完整或已损坏");
            }


            //控制码
            package.C0 = bytes[6]; //控制码
            package.C1 = bytes[7]; //功能码

            //数据长度
            package.L0 = bytes[8];
            package.L1 = bytes[9];

            package.data = new byte[package.DataLength];
            if (bytes.Length - PackageDefine.MinLenth != package.DataLength)
            {
                throw new ArgumentException("数据长度和数据不匹配");
            }
            for (int i = 0; i < package.DataLength; i++)
            {
                package.data[i] = bytes[10 + i];
            }

            package.CS = bytes[bytes.Length - 2];//校验码


            if (bytes[bytes.Length - 1] != PackageDefine.EndByte)
            {
                throw new ArgumentException("数据帧不完整或已损坏");
            }

            if (Package.CreateCS(package) != package.CS)
            {
                throw new ArgumentException("数据帧校验失败");
            }

            return(package);
        }
Exemplo n.º 4
0
 /// <summary>
 /// 生成校验码
 /// </summary>
 /// <returns></returns>
 public byte CreateCS()
 {
     return(Package.CreateCS(this));
 }