using Newtonsoft.Json.Linq; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO.Ports; using System.Reflection; using System.Text; using System.Threading; using System.Linq; using SlnMesnac.Model.domain; using SlnMesnac.Model.dto; using System.Text.Json.Nodes; namespace SlnMesnac.Business { public class SerialPortBusiness { private static readonly object _object = new object(); private SerialPort _serialPort; public delegate void RefreshSerialPortDeviceStatus(int isFlag); public event RefreshSerialPortDeviceStatus RefreshSerialPortDeviceStatusEvent; /// /// 刷新日志内容 /// public delegate void RefreshLogMessage(string message); public event RefreshLogMessage RefreshLogMessageEvent; //public delegate void ReceivedMeterConfigInfo(ElectricMeterInfoDto electricMeterInfo, List electricMeterConfigInfos); //public event ReceivedMeterConfigInfo ReceivedMeterConfigInfoEvent; public delegate void ReceivedBarcodeInfo(string barcodeInfo); public static event ReceivedBarcodeInfo? ReceivedBarcodeInfoEvent; //public delegate void ReceivedGatewayConfigInfo(GatewayInfoDto gatewayInfoDto); //public event ReceivedGatewayConfigInfo ReceivedGatewayConfigInfoEvent; /// /// 获取系统内的串口 /// /// public void GetSerialPorts(out List serialPorts) { serialPorts = SerialPort.GetPortNames().ToList(); } /// /// 打开串口 /// /// 串口号 /// 波特率 /// 校验位None = 0,Odd = 1, Even = 2,Mark = 3,Space = 4, /// 数据位 /// 停止位 public void OpenSerialPort(string serialPort, int baudRate, int parity, int dataBits, int stopBits) { if (string.IsNullOrEmpty(serialPort)) { throw new ArgumentException("串口号不能为空"); } _serialPort = new SerialPort(serialPort, baudRate, (System.IO.Ports.Parity)parity, dataBits, (StopBits)stopBits); _serialPort.DataReceived += SerialPortDataReceived; _serialPort.Open(); RefreshSerialPortDeviceStatusEvent?.Invoke(1); } /// /// 关闭串口 /// /// public void CloseSerialPort() { if (_serialPort == null) { throw new ArgumentException("串口实例为空"); } _serialPort.Close(); RefreshSerialPortDeviceStatusEvent?.Invoke(2); } /// /// 发送数据 /// /// /// public void SendMessage(string message) { try { if (message == null) { throw new ArgumentException("发送内容为空"); } //RefreshLogMessageEvent?.Invoke($"发送指令:{message}"); if(_serialPort != null && _serialPort.IsOpen) { _serialPort.Write(message); RefreshLogMessageEvent?.Invoke("发送成功"); } else { RefreshLogMessageEvent?.Invoke("串口未打开,无法发送数据"); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } /// /// 串口数据接收 /// /// /// private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e) { try { lock (string.Empty) { Thread.Sleep(50); SerialPort sp = (SerialPort)sender; // 读取字节数据 int bytesToRead = _serialPort.BytesToRead; byte[] buffer = new byte[bytesToRead]; sp.Read(buffer, 0, bytesToRead); string data = System.Text.Encoding.ASCII.GetString(buffer); if (!string.IsNullOrEmpty(data)) { RefreshLogMessageEvent?.Invoke("Received data: " + data); ReceivedBarcodeInfoEvent?.Invoke(data); //Analys(data); } } } catch (Exception ex) { Console.WriteLine("接收数据时发生错误: " + ex.Message); } } ///// ///// 解析数据 ///// ///// //public void Analys(string jsonStr) //{ // try // { // if (jsonStr.Contains("OK")) // { // RefreshLogMessageEvent?.Invoke($"修改成功"); // return; // } // else if (jsonStr.Contains("Error")) // { // RefreshLogMessageEvent?.Invoke($"修改失败"); // return; // } // else if (jsonStr.Contains("MeterSerialNumber")) //电表信息 // { // #region 判断JSON格式合法性,获取第一个}为结尾,避免硬件返回多余数据 // int lastBraceIndex = jsonStr.IndexOf('}'); // if (lastBraceIndex != -1) // { // jsonStr = jsonStr.Substring(0, lastBraceIndex + 1); // } // else // { // RefreshLogMessageEvent?.Invoke($"设备信息指令有误:{jsonStr}"); // return; // } // #endregion // RefreshLogMessageEvent?.Invoke($"解析电表设备信息:{jsonStr}"); // if (!string.IsNullOrEmpty(jsonStr)) // { // var jsonObject = JObject.Parse(jsonStr); // ElectricMeterInfoDto electricMeterInfo = JsonConvert.DeserializeObject(jsonObject.ToString()); // AnalysMeterConfig(jsonObject, ref electricMeterInfo, out List electricMeterConfigInfos); // ReceivedMeterConfigInfoEvent?.Invoke(electricMeterInfo, electricMeterConfigInfos); // } // }else if (jsonStr.Contains("NaturalGas")) // { // RefreshLogMessageEvent?.Invoke($"解析网关设备信息:{jsonStr}"); // GatewayInfoDto gatewayInfo = JsonConvert.DeserializeObject(jsonStr); // ReceivedGatewayConfigInfoEvent?.Invoke(gatewayInfo); // } // } // catch (Exception ex) // { // RefreshLogMessageEvent?.Invoke($"解析逻辑异常:{ex.Message};原始数据:{jsonStr}"); // } //} ///// ///// 解析子表配置信息 ///// ///// ///// ///// //private void AnalysMeterConfig(JObject jsonObject, ref ElectricMeterInfoDto electricMeterInfo, out List electricMeterConfigInfos) //{ // electricMeterConfigInfos = new List(); // foreach (var property in jsonObject.Properties()) // { // if (electricMeterInfo.GetType().GetProperty(property.Name) == null) // { // string proValue = property.Value.ToObject(); // string[] proValueArray = proValue.Split(","); // if (proValueArray.Length == 4) // { // ElectricMeterConfigInfo electricMeterConfigInfo = new ElectricMeterConfigInfo(); // electricMeterConfigInfo.PointName = property.Name; // electricMeterConfigInfo.InitialAddress = proValueArray[0]; // electricMeterConfigInfo.Length = Convert.ToInt32(proValueArray[1]); // electricMeterConfigInfo.Rate = proValueArray[2]; // electricMeterConfigInfo.DataType = Convert.ToInt32(proValueArray[3]); // electricMeterConfigInfos.Add(electricMeterConfigInfo); // } // } // } //} } }