using Newtonsoft.Json; using ScottPlot.Plottables; using SunlightCentralizedControlManagement_SCCM_.View; using SunlightCentralizedControlManagement_SCCM_.ViewModel; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Windows; using TouchSocket.Core; using TouchSocket.SerialPorts; using TouchSocket.Sockets; using static SkiaSharp.HarfBuzz.SKShaper; using static SunlightCentralizedControlManagement_SCCM_.UserClass.SqliteHelper; using static System.Net.Mime.MediaTypeNames; namespace SunlightCentralizedControlManagement_SCCM_.UserClass { public class AsyncSerialPortClient { public static string ClipBetween(string source, char startChar, char endChar, bool includeBounds = false) { if (string.IsNullOrEmpty(source)) return string.Empty; int startIndex = source.IndexOf(startChar); if (startIndex == -1) return string.Empty; int endIndex = source.IndexOf(endChar, startIndex + 1); if (endIndex == -1) return string.Empty; if (includeBounds) { return source.Substring(startIndex, endIndex - startIndex + 1); } else { int contentStart = startIndex + 1; int contentLength = endIndex - startIndex - 1; return contentLength > 0 ? source.Substring(contentStart, contentLength) : string.Empty; } } public static string PortCOM1 { get; set; } public static string PortCOM2 { get; set; } public static string PortCOM3 { get; set; } public static string PortCOM4 { get; set; } public static async Task PortClient(SerialPortClient portclient, string com, int BAUD) { //var client = new SerialPortClient(); portclient.Connecting = (client, e) => { return EasyTask.CompletedTask; };//即将连接到端口 portclient.Connected = (client, e) => { return EasyTask.CompletedTask; };//成功连接到端口 portclient.Closing = (client, e) => { return EasyTask.CompletedTask; };//即将从端口断开连接。此处仅主动断开才有效。 portclient.Closed = (client, e) => { return EasyTask.CompletedTask; };//从端口断开连接,当连接不成功时不会触发。 portclient.Received = (client, e) => { _responseEvent.Set(); string[] sArray = Regex.Split(e.ByteBlock.Span.ToString(Encoding.UTF8), @"\n", RegexOptions.IgnoreCase); for (int i = 0; i < sArray.Length; i++) { if (!string.IsNullOrEmpty(sArray[i])) { string SYSAPI = sArray[i].Substring(0, 5); string Station = ClipBetween(sArray[i], '[', ']'); string DAT = sArray[i].Substring(sArray[i].IndexOf("]") + 1); if (SYSAPI == "SC800") { try { Dictionary _new = new Dictionary();//缓存函数 _new = JsonConvert.DeserializeObject>(DAT);//反序列化 DataRow drEmployee = MainWindowViewModel.Machines.Select("Station='" + Station + "' AND Serial = 'PORT1'").First(); drEmployee.BeginEdit(); drEmployee["State"] = "802"; drEmployee.EndEdit(); drEmployee.AcceptChanges(); } catch (Exception ex) { LogGing.ERRDATA(ex); MainWindowViewModel.ERR_c++; } } else if (SYSAPI == "SC810") { try { MainWindowViewModel.SQLiteHelpers.Update("WorkOrder", new Dictionary { { "State", 111 } }, "WorkOrder ='" + DAT + "'", null); } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } } else if (SYSAPI == "SC811") { try { MainWindowViewModel.SQLiteHelpers.Update("WorkOrder", new Dictionary { { "State", 113 } }, "WorkOrder ='" + DAT + "'", null); } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } } else if (SYSAPI == "SC812") { try { MainWindowViewModel.SQLiteHelpers.Update("WorkOrder", new Dictionary { { "State", 101 } }, "WorkOrder ='" + DAT + "'", null); } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } } else if (SYSAPI == "SC827") { try { } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } }//获取呼叫领料单 else if (SYSAPI == "SC830") { try { // return EasyTask.CompletedTask; ; Dictionary _new = new Dictionary();//缓存函数 _new = JsonConvert.DeserializeObject>(DAT);//反序列化 DataRow drEmployee = MainWindowViewModel.Machines.Select("Station='" + Station + "' AND Serial = 'PORT1'").First(); drEmployee.BeginEdit(); drEmployee["ERR"] = _new.GetValue("ERR"); drEmployee["LOCK"] = _new.GetValue("LOCK"); drEmployee["Message"] = _new.GetValue("Status"); drEmployee["WorkOrder"] = _new.GetValue("WorkNumder"); drEmployee["Temperature"] = _new.GetValue("MTT"); drEmployee["WaterLevel"] = _new.GetValue("MTL"); drEmployee["Process"] = _new.GetValue("Process"); drEmployee["Step"] = _new.GetValue("Step"); drEmployee["UserButton"] = _new.GetValue("UserButton"); if (_new.GetValue("UserInfoStart").ToString() != "900") { drEmployee["UserInfoStart"] = _new.GetValue("UserInfoStart"); } drEmployee["UserInfo"] = _new.GetValue("UserInfo"); drEmployee["WORK_RUN"] = _new.GetValue("WORK_RUN"); drEmployee["RUN_STEPID"] = _new.GetValue("RUN_STEPID"); drEmployee["CALL"] = _new.GetValue("CALL"); drEmployee.EndEdit(); drEmployee.AcceptChanges(); if (_new.GetValue("Status").ToString() != "----------") { Dictionary Chart_new = new Dictionary();//缓存函数 Chart_new.Add("WorkOrder", _new.GetValue("WorkNumder")); Chart_new.Add("Machine", _new.GetValue("Machine")); Chart_new.Add("Time", _new.GetValue("Time")); Chart_new.Add("MST", _new.GetValue("MST")); Chart_new.Add("MTT", _new.GetValue("MTT")); Chart_new.Add("MTL", _new.GetValue("MTL")); Chart_new.Add("MTH", _new.GetValue("MTH")); Chart_new.Add("MUT", _new.GetValue("MUT")); Chart_new.Add("STTA", _new.GetValue("STTA")); Chart_new.Add("STLA", _new.GetValue("STLA")); Chart_new.Add("STTB", _new.GetValue("STTB")); Chart_new.Add("STLB", _new.GetValue("STLB")); Chart_new.Add("STTC", _new.GetValue("STTC")); Chart_new.Add("STLC", _new.GetValue("STLC")); MainWindowViewModel.SQLiteChartAdress.InsertData("Chart", Chart_new);// 执行插入 } } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } }//当前信息 else if (SYSAPI == "SC831") { try { } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } } else if (SYSAPI == "SC832") { try { MainWindowViewModel.MachineLOG = DAT; } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } }//当前细节信息 else if (SYSAPI == "SC833") { try { } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } }//当前领料单信息 else if (SYSAPI == "SC851") { try { } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } }//数字开关表 else if (SYSAPI == "SC852") { try { } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } }//寄存器表 else if (SYSAPI == "SC853") { try { } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } }//缓存表 else if (SYSAPI == "SC854") { try { } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } }//程序设置表 else if (SYSAPI == "SC855") { try { } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } }//系统设置表 else if (SYSAPI == "SC910") { try { } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } }//发布失败 else if (SYSAPI == "SC911") { try { } catch (Exception ex) { LogGing.LogGingDATA("[ERR='" + ex + "']=Exception"); MainWindowViewModel.ERR_c++; } }//细节错误 else if (SYSAPI == "SC980") { } } } return EasyTask.CompletedTask; ; }; await portclient.SetupAsync(new TouchSocketConfig() .SetSerialPortOption(new SerialPortOption() { BaudRate = BAUD,//波特率 DataBits = 8,//数据位 Parity = System.IO.Ports.Parity.None,//校验位 PortName = com,//COM StopBits = System.IO.Ports.StopBits.One,//停止位 }) .SetSerialDataHandlingAdapter(() => new PeriodPackageAdapter() { CacheTimeout = TimeSpan.FromMilliseconds(100) }) .ConfigurePlugins(a => { //a.Add(); })); try { await portclient.ConnectAsync(); } catch (Exception ex) { LogGing.ERRDATA(ex); } } public static async Task PortClient2(SerialPortClient portclient, string com, int BAUD) { //var client = new SerialPortClient(); portclient.Connecting = (client, e) => { return EasyTask.CompletedTask; };//即将连接到端口 portclient.Connected = (client, e) => { return EasyTask.CompletedTask; };//成功连接到端口 portclient.Closing = (client, e) => { return EasyTask.CompletedTask; };//即将从端口断开连接。此处仅主动断开才有效。 portclient.Closed = (client, e) => { return EasyTask.CompletedTask; };//从端口断开连接,当连接不成功时不会触发。 portclient.Received = (client, e) => { _responseEvent2.Set(); string[] sArray = Regex.Split(e.ByteBlock.Span.ToString(Encoding.UTF8), @"\n", RegexOptions.IgnoreCase); return EasyTask.CompletedTask; ; }; await portclient.SetupAsync(new TouchSocketConfig() .SetSerialPortOption(new SerialPortOption() { BaudRate = BAUD,//波特率 DataBits = 8,//数据位 Parity = System.IO.Ports.Parity.None,//校验位 PortName = com,//COM StopBits = System.IO.Ports.StopBits.One,//停止位 }) .SetSerialDataHandlingAdapter(() => new PeriodPackageAdapter() { CacheTimeout = TimeSpan.FromMilliseconds(100) }) .ConfigurePlugins(a => { //a.Add(); })); try { await portclient.ConnectAsync(); } catch (Exception ex) { LogGing.ERRDATA(ex); } } public static async Task PortClient3(SerialPortClient portclient, string com, int BAUD) { //var client = new SerialPortClient(); portclient.Connecting = (client, e) => { return EasyTask.CompletedTask; };//即将连接到端口 portclient.Connected = (client, e) => { return EasyTask.CompletedTask; };//成功连接到端口 portclient.Closing = (client, e) => { return EasyTask.CompletedTask; };//即将从端口断开连接。此处仅主动断开才有效。 portclient.Closed = (client, e) => { return EasyTask.CompletedTask; };//从端口断开连接,当连接不成功时不会触发。 portclient.Received = (client, e) => { _responseEvent3.Set(); string[] sArray = Regex.Split(e.ByteBlock.Span.ToString(Encoding.UTF8), @"\n", RegexOptions.IgnoreCase); return EasyTask.CompletedTask; ; }; await portclient.SetupAsync(new TouchSocketConfig() .SetSerialPortOption(new SerialPortOption() { BaudRate = BAUD,//波特率 DataBits = 8,//数据位 Parity = System.IO.Ports.Parity.None,//校验位 PortName = com,//COM StopBits = System.IO.Ports.StopBits.One,//停止位 }) .SetSerialDataHandlingAdapter(() => new PeriodPackageAdapter() { CacheTimeout = TimeSpan.FromMilliseconds(100) }) .ConfigurePlugins(a => { //a.Add(); })); try { await portclient.ConnectAsync(); } catch (Exception ex) { LogGing.ERRDATA(ex); } } public static async Task PortClient4(SerialPortClient portclient, string com, int BAUD) { //var client = new SerialPortClient(); portclient.Connecting = (client, e) => { return EasyTask.CompletedTask; };//即将连接到端口 portclient.Connected = (client, e) => { return EasyTask.CompletedTask; };//成功连接到端口 portclient.Closing = (client, e) => { return EasyTask.CompletedTask; };//即将从端口断开连接。此处仅主动断开才有效。 portclient.Closed = (client, e) => { return EasyTask.CompletedTask; };//从端口断开连接,当连接不成功时不会触发。 portclient.Received = (client, e) => { _responseEvent4.Set(); string[] sArray = Regex.Split(e.ByteBlock.Span.ToString(Encoding.UTF8), @"\n", RegexOptions.IgnoreCase); return EasyTask.CompletedTask; ; }; await portclient.SetupAsync(new TouchSocketConfig() .SetSerialPortOption(new SerialPortOption() { BaudRate = BAUD,//波特率 DataBits = 8,//数据位 Parity = System.IO.Ports.Parity.None,//校验位 PortName = com,//COM StopBits = System.IO.Ports.StopBits.One,//停止位 }) .SetSerialDataHandlingAdapter(() => new PeriodPackageAdapter() { CacheTimeout = TimeSpan.FromMilliseconds(100) }) .ConfigurePlugins(a => { //a.Add(); })); try { await portclient.ConnectAsync(); } catch (Exception ex) { LogGing.ERRDATA(ex); } } public static readonly ManualResetEventSlim _responseEvent = new ManualResetEventSlim(false); public static readonly ManualResetEventSlim _responseEvent2 = new ManualResetEventSlim(false); public static readonly ManualResetEventSlim _responseEvent3 = new ManualResetEventSlim(false); public static readonly ManualResetEventSlim _responseEvent4 = new ManualResetEventSlim(false); /// /// 发送指令并等待响应,超时时间为500ms /// /// 要发送的指令字节数组 /// 从机的响应数据,超时则为null public static void SendCommandAndWait(SerialPortClient serialPortClients, string command) { try { _responseEvent.Reset(); serialPortClients.Send(command); // 发送指令 // 等待500毫秒或直到收到响应 _responseEvent.Wait(TimeSpan.FromMilliseconds(1000)); // 重置事件状态 _responseEvent.Set(); } catch (Exception) { } } public static void SendCommandAndWait2(SerialPortClient serialPortClients, string command) { try { _responseEvent2.Reset(); serialPortClients.Send(command); // 发送指令 // 等待500毫秒或直到收到响应 _responseEvent2.Wait(TimeSpan.FromMilliseconds(1000)); // 重置事件状态 _responseEvent2.Set(); } catch (Exception) { } } public static void SendCommandAndWait3(SerialPortClient serialPortClients, string command) { try { _responseEvent3.Reset(); serialPortClients.Send(command); // 发送指令 // 等待500毫秒或直到收到响应 _responseEvent3.Wait(TimeSpan.FromMilliseconds(1000)); // 重置事件状态 _responseEvent3.Set(); } catch (Exception) { } } public static void SendCommandAndWait4(SerialPortClient serialPortClients, string command) { try { _responseEvent4.Reset(); serialPortClients.Send(command); // 发送指令 // 等待500毫秒或直到收到响应 _responseEvent4.Wait(TimeSpan.FromMilliseconds(1000)); // 重置事件状态 _responseEvent4.Set(); } catch (Exception) { } } } }