using ScottPlot.Plottables; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using TouchSocket.Core; using TouchSocket.SerialPorts; using TouchSocket.Sockets; using static SkiaSharp.HarfBuzz.SKShaper; namespace SunlightCentralizedControlManagement_SCCM_.UserClass { public class AsyncSerialPortClient { 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 DAT = e.ByteBlock.Span.ToString(Encoding.UTF8); //string DAT1 = CRCcheck16.ToCRC16(e.ByteBlock.Span.ToString(Encoding.UTF8)); 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(); })); await portclient.ConnectAsync(); } 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 DAT = e.ByteBlock.Span.ToString(Encoding.UTF8); //string DAT1 = CRCcheck16.ToCRC16(e.ByteBlock.Span.ToString(Encoding.UTF8)); 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(); })); await portclient.ConnectAsync(); } 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 DAT = e.ByteBlock.Span.ToString(Encoding.UTF8); //string DAT1 = CRCcheck16.ToCRC16(e.ByteBlock.Span.ToString(Encoding.UTF8)); 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(); })); await portclient.ConnectAsync(); } 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 DAT = e.ByteBlock.Span.ToString(Encoding.UTF8); //string DAT1 = CRCcheck16.ToCRC16(e.ByteBlock.Span.ToString(Encoding.UTF8)); 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(); })); await portclient.ConnectAsync(); } private static readonly ManualResetEventSlim _responseEvent = new ManualResetEventSlim(false); private static readonly ManualResetEventSlim _responseEvent2 = new ManualResetEventSlim(false); private static readonly ManualResetEventSlim _responseEvent3 = new ManualResetEventSlim(false); private static readonly ManualResetEventSlim _responseEvent4 = new ManualResetEventSlim(false); /// /// 发送指令并等待响应,超时时间为500ms /// /// 要发送的指令字节数组 /// 从机的响应数据,超时则为null public static void SendCommandAndWait(SerialPortClient serialPortClients, string command) { _responseEvent.Reset(); serialPortClients.Send(command); // 发送指令 // 等待500毫秒或直到收到响应 _responseEvent.Wait(TimeSpan.FromMilliseconds(1000)); // 重置事件状态 } public static void SendCommandAndWait2(SerialPortClient serialPortClients, string command) { _responseEvent2.Reset(); serialPortClients.Send(command); // 发送指令 // 等待500毫秒或直到收到响应 _responseEvent2.Wait(TimeSpan.FromMilliseconds(1000)); // 重置事件状态 } public static void SendCommandAndWait3(SerialPortClient serialPortClients, string command) { _responseEvent3.Reset(); serialPortClients.Send(command); // 发送指令 // 等待500毫秒或直到收到响应 _responseEvent3.Wait(TimeSpan.FromMilliseconds(1000)); // 重置事件状态 } public static void SendCommandAndWait4(SerialPortClient serialPortClients, string command) { _responseEvent4.Reset(); serialPortClients.Send(command); // 发送指令 // 等待500毫秒或直到收到响应 _responseEvent4.Wait(TimeSpan.FromMilliseconds(1000)); // 重置事件状态 } } }