using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MECF.Framework.Simulator.Core.Driver { public enum SerialType { ASCII=0, BUFFER=1 } public class BaseSerialSimulator { public event Action MessageIn; public event Action MessageOut; public bool IsEnabled { get { return _serialPort != null && _serialPort.IsOpen; } } public string PortName { get { return _serialPort.PortName; } set { _serialPort.PortName = value; } } public bool IsConnected { get;set;} private SerialPort _serialPort; private SerialType _type; public BaseSerialSimulator(string portName, SerialType type=SerialType.ASCII) { _serialPort = new SerialPort(portName); _serialPort.DataReceived += SerialPort_DataReceived; _type = type; } public void Disable() { try { _serialPort.Close(); } catch { } IsConnected = false; } /// /// 连接 /// public void Enable() { try { _serialPort.Open(); IsConnected = true; } catch { IsConnected = false; } } private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { int length = _serialPort.BytesToRead; if (length > 0) { byte[] data = new byte[length]; _serialPort.Read(data, 0, length); if(_type==SerialType.ASCII) { string str=ASCIIEncoding.ASCII.GetString(data); MessageIn(str); ProcessMessageIn(str); } else { string str = MessageConvert(data); MessageIn(str); ProcessMessageBuffer(data); } } } protected virtual string MessageConvert(byte[] byt) { return BitConverter.ToString(byt).Replace("-", " "); } protected virtual void ProcessMessageIn(string msg) { } protected virtual void ProcessMessageBuffer(byte[] byt) { } public void WriteBuffer(byte[] byt) { string str=MessageConvert(byt); try { _serialPort.Write(byt,0,byt.Length); MessageOut(str); } catch { IsConnected=false; } } public void WriteMessage(string msg) { try { _serialPort.WriteLine(msg); MessageOut(msg); } catch { IsConnected=false; } } } }