CoreProtocol.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Core.ONH.Collection.Protocol;
  6. namespace Core.ONH.Collection.Send
  7. {
  8. /// <summary>
  9. /// 自定义串口通信协议
  10. /// </summary>
  11. public class CoreProtocol
  12. {
  13. /// <summary>
  14. /// 组帧 特定格式 0x68 + Len + 数据域(有效数据 + 2位有效数据的Crc16的校验) + 0x68
  15. /// </summary>
  16. /// <param name="byteArray"></param>
  17. /// <returns></returns>
  18. public static byte[] Framing(byte[] byteArray)
  19. {
  20. byteArray = Crc16.GetCRC16Full(byteArray, true);
  21. byte[] fullyByte =
  22. new byte[] { 0x68 }.Concat(new[] { (byte)byteArray.Length }).Concat(byteArray).Concat(new byte[] { 0x68 }).ToArray();
  23. return fullyByte;
  24. }
  25. /// <summary>
  26. /// 解帧 检查数据帧是否有效正确
  27. /// </summary>
  28. /// <param name="byteArray">数据帧</param>
  29. /// <param name="data">有效数据</param>
  30. /// <returns>据帧是否有效正确 </returns>
  31. public static DeframeType Deframe(List<byte> byteArray, out List<byte> data)
  32. {
  33. data = new List<byte>();
  34. try
  35. {
  36. if (byteArray == null || byteArray.Count<=0) return DeframeType.RightFrame;
  37. if (byteArray[0] != 0x68) return DeframeType.WrongHead;
  38. int len = byteArray[1];
  39. if (byteArray.Count < len + 2 + 1) return DeframeType.LengthLess;
  40. if (byteArray[1 + len + 1] != 0x68) return DeframeType.WrongHead;
  41. List<byte> dataArea = byteArray.Skip(2).Take(len).ToList();
  42. data = dataArea.Take(len - 2).ToList();
  43. if (!Crc16.CompareCrc(dataArea.Take(len-2).ToArray(), true, dataArea.Skip(len - 2).Take(2).ToArray())) return DeframeType.WrongFrame;
  44. return DeframeType.RightFrame;
  45. }
  46. catch (Exception)
  47. {
  48. return DeframeType.UnKnow;
  49. }
  50. }
  51. }
  52. public enum DeframeType
  53. {
  54. RightFrame =0,
  55. WrongHead = 1,
  56. LengthLess = 2,
  57. WrongFrame = 3,
  58. UnKnow
  59. }
  60. }