using System; using System.Collections.Generic; using System.Linq; using System.Text; using Core.ONH.Collection.Protocol; namespace Core.ONH.Collection.Send { /// /// 自定义串口通信协议 /// public class CoreProtocol { /// /// 组帧 特定格式 0x68 + Len + 数据域(有效数据 + 2位有效数据的Crc16的校验) + 0x68 /// /// /// public static byte[] Framing(byte[] byteArray) { byteArray = Crc16.GetCRC16Full(byteArray, true); byte[] fullyByte = new byte[] { 0x68 }.Concat(new[] { (byte)byteArray.Length }).Concat(byteArray).Concat(new byte[] { 0x68 }).ToArray(); return fullyByte; } /// /// 解帧 检查数据帧是否有效正确 /// /// 数据帧 /// 有效数据 /// 据帧是否有效正确 public static DeframeType Deframe(List byteArray, out List data) { data = new List(); try { if (byteArray == null || byteArray.Count<=0) return DeframeType.RightFrame; if (byteArray[0] != 0x68) return DeframeType.WrongHead; int len = byteArray[1]; if (byteArray.Count < len + 2 + 1) return DeframeType.LengthLess; if (byteArray[1 + len + 1] != 0x68) return DeframeType.WrongHead; List dataArea = byteArray.Skip(2).Take(len).ToList(); data = dataArea.Take(len - 2).ToList(); if (!Crc16.CompareCrc(dataArea.Take(len-2).ToArray(), true, dataArea.Skip(len - 2).Take(2).ToArray())) return DeframeType.WrongFrame; return DeframeType.RightFrame; } catch (Exception) { return DeframeType.UnKnow; } } } public enum DeframeType { RightFrame =0, WrongHead = 1, LengthLess = 2, WrongFrame = 3, UnKnow } }