| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using Core.ONH.Collection.Protocol;
- namespace Core.ONH.Collection.Send
- {
- /// <summary>
- /// 自定义串口通信协议
- /// </summary>
- public class CoreProtocol
- {
- /// <summary>
- /// 组帧 特定格式 0x68 + Len + 数据域(有效数据 + 2位有效数据的Crc16的校验) + 0x68
- /// </summary>
- /// <param name="byteArray"></param>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// 解帧 检查数据帧是否有效正确
- /// </summary>
- /// <param name="byteArray">数据帧</param>
- /// <param name="data">有效数据</param>
- /// <returns>据帧是否有效正确 </returns>
- public static DeframeType Deframe(List<byte> byteArray, out List<byte> data)
- {
- data = new List<byte>();
- 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<byte> 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
- }
- }
|