using Edge.Core.Parser.BinaryParser; using Edge.Core.Parser.BinaryParser.Attributes; using Edge.Core.Parser.BinaryParser.MessageEntity; using Edge.Core.Processor.Communicator; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestComPortServer { public class Message : MessageTemplateBase { [Format(4, EncodingType.BIN, -9999)] public int Id { get; set; } [Format(10, EncodingType.ASCII, -9900)] public String Description { get; set; } } public class MessageCutter : IMessageCutter { private object sync_object = new object(); private List buffer = new List(); public byte[] Message { get; private set; } public event EventHandler OnMessageCut; public event EventHandler OnInvalidMessageRead; public void Feed(byte[] data) { lock (this.sync_object) for (int i = 0; i < data.Length; i++) { if (this.buffer.Count == 0 && data[i] != 0xFA) continue; buffer.Add(data[i]); if (buffer.Last() == 0xFF) { this.Message = this.buffer.ToArray(); this.OnMessageCut?.Invoke(this, null); this.buffer.Clear(); } } } } public class MessageParser : ParserBase { public MessageParser() : base(new MessageLookup()) { } public override byte[] Serialize(MessageTemplateBase message) { return (new byte[] { 0xFA }.Concat(base.Serialize(message)).Concat(new byte[] { 0xFF })).ToArray(); } public override MessageTemplateBase Deserialize(byte[] rawData) { var m = base.Deserialize(rawData.Skip(1).Take(rawData.Length - 2).ToArray()); return m; } } public class MessageLookup : IMessageTemplateLookup { public MessageTemplateBase GetMessageTemplateByRawBytes(byte[] bytes) { return new Message(); } } }