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
}
}