/// <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); }
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 == ""); }
/// <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); }
/// <summary> /// 生成校验码 /// </summary> /// <returns></returns> public byte CreateCS() { return(Package.CreateCS(this)); }