diff --git a/src/Khd.Core.Library/Extensions/NetworkHelper.cs b/src/Khd.Core.Library/Extensions/NetworkHelper.cs new file mode 100644 index 0000000..907c6e9 --- /dev/null +++ b/src/Khd.Core.Library/Extensions/NetworkHelper.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Khd.Core.Library.Extensions +{ + public class NetworkHelper + { + /// + /// 获取本地计算机的所有 IPv4 地址。 + /// + /// IPv4 地址列表。如果没有找到,则返回一个空列表。 + public static List GetLocalIPv4Addresses() + { + List ipAddresses = new List(); + + try + { + // 获取所有网络接口 + var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); + + foreach (var networkInterface in networkInterfaces) + { + // 检查网络接口是否处于正常状态且不是回环接口 + if (networkInterface.OperationalStatus == OperationalStatus.Up && + networkInterface.NetworkInterfaceType != NetworkInterfaceType.Loopback) + { + // 获取该接口的IP属性 + var ipProperties = networkInterface.GetIPProperties(); + + // 获取单播地址集合 + var unicastAddresses = ipProperties.UnicastAddresses; + + foreach (var address in unicastAddresses) + { + // 检查是否是 IPv4 地址 + if (address.Address.AddressFamily == AddressFamily.InterNetwork) + { + // 获取 IPv4 地址并添加到列表 + var ipAddress = address.Address.ToString(); + if (!string.IsNullOrEmpty(ipAddress) && !ipAddress.StartsWith("169.254")) // 排除自动私有地址 + { + ipAddresses.Add(ipAddress); + } + } + } + } + } + } + catch + { + Console.WriteLine("获取IP地址时发生错误"); + } + + return ipAddresses; + } + + /// + /// 获取本地计算机的第一个有效的 IPv4 地址。 + /// + /// 第一个有效的 IPv4 地址,如果没有找到则返回 null。 + public static string GetFirstLocalIPv4Address() + { + var ipAddresses = GetLocalIPv4Addresses(); + return ipAddresses.Count > 0 ? ipAddresses[0] : null; + } + } +} diff --git a/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs b/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs index 1ed8361..390b727 100644 --- a/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs +++ b/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs @@ -4,6 +4,7 @@ using Khd.Core.Domain.Auth; using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; +using Khd.Core.Library.Extensions; using Khd.Core.Library.Mapper; using Khd.Core.Plc; using Khd.Core.Plc.S7; @@ -62,6 +63,7 @@ namespace Khd.Core.Wpf.Form private object order_code; private int UpState;//对应上件站点的状态,0为良好 1为损坏 private SerialPortModel serialPortModel; + private SerialPortModel virtualSerialPortModel; private SerialPortHelper serialPortHelper; List basePlcpoints = new List(); object timerjilu; @@ -245,17 +247,40 @@ namespace Khd.Core.Wpf.Form try { - serialPortModel = new SerialPortModel(); - serialPortModel.PortName = "COM1"; - serialPortModel.BaudRate = 9600; - serialPortModel.DataBits = 8; - serialPortModel.Parity = Parity.None; - serialPortModel.StopBits = StopBits.One; - serialPortHelper = new SerialPortHelper(); - serialPortHelper.OpenMyConn(serialPortModel); - Thread scanThread = new Thread(ScanMessage); - scanThread.IsBackground = true; - scanThread.Start(); + string ip = NetworkHelper.GetFirstLocalIPv4Address(); + if ("192.168.2.26".Equals(ip)) + { + // 获取所有可用的串口名称 + string[] portNames = SerialPort.GetPortNames(); + //虚拟串口 + virtualSerialPortModel = new SerialPortModel(); + virtualSerialPortModel = new SerialPortModel(); + virtualSerialPortModel.PortName = "COM10"; + virtualSerialPortModel.BaudRate = 9600; + virtualSerialPortModel.DataBits = 8; + virtualSerialPortModel.Parity = Parity.None; + virtualSerialPortModel.StopBits = StopBits.One; + serialPortHelper = new SerialPortHelper(); + serialPortHelper.OpenVirtualMyConn(virtualSerialPortModel); + + //扫码枪串口 + serialPortModel = new SerialPortModel(); + serialPortModel.PortName = "COM1"; + serialPortModel.BaudRate = 9600; + serialPortModel.DataBits = 8; + serialPortModel.Parity = Parity.None; + serialPortModel.StopBits = StopBits.One; + // serialPortHelper = new SerialPortHelper(); + serialPortHelper.OpenMyConn(serialPortModel); + Thread scanThread = new Thread(ScanMessage); + scanThread.IsBackground = true; + scanThread.Start(); + + } + + + + } catch (Exception ex) { @@ -342,6 +367,8 @@ namespace Khd.Core.Wpf.Form } + + private void TaskOrderTimer(object? obj) { while (true) diff --git a/src/Khd.Core.Wpf/Scan/SerialPortHelper.cs b/src/Khd.Core.Wpf/Scan/SerialPortHelper.cs index 5377e57..d15a849 100644 --- a/src/Khd.Core.Wpf/Scan/SerialPortHelper.cs +++ b/src/Khd.Core.Wpf/Scan/SerialPortHelper.cs @@ -20,6 +20,7 @@ namespace Khd.Core.Wpf.Scan //缓冲信息 public string ReceiveData = ""; private SerialPort myCom = new SerialPort();//串口对象 + private SerialPort virtualCom = new SerialPort();//虚拟串口对象 /// /// 串口属性 /// @@ -35,6 +36,22 @@ namespace Khd.Core.Wpf.Scan } } + /// + /// 串口属性 + /// + public SerialPort VirtualCom + { + get + { + return virtualCom; + } + set + { + virtualCom = value; + } + } + + private byte myReceiveByte = 0;//接收字节 private byte[] bData = new byte[1024];//接收的字节数组 private int index = 0; @@ -58,6 +75,22 @@ namespace Khd.Core.Wpf.Scan myCom.DataReceived += MyCom_DataReceived;//串口接收数据事件 myCom.Open();//打开串口 } + + public void OpenVirtualMyConn(SerialPortModel entiry) + { + if (virtualCom.IsOpen) + { + virtualCom.Close();//关闭 + } + virtualCom.PortName = entiry.PortName;//串口名称 + virtualCom.BaudRate = entiry.BaudRate;//波特率 + virtualCom.DataBits = entiry.DataBits;//数据位 + virtualCom.StopBits = entiry.StopBits;//停止位 + virtualCom.Parity = entiry.Parity;//校验位 + virtualCom.ReceivedBytesThreshold = 1;//设置串口缓冲区的字节数 + virtualCom.DataReceived += virtualCom_DataReceived;//串口接收数据事件 + virtualCom.Open();//打开串口 + } /// /// 串口接收事件 /// @@ -70,10 +103,13 @@ namespace Khd.Core.Wpf.Scan //读取串口缓冲区的字节数据,分两次传递结果 byte[] result = new byte[MyCom.BytesToRead]; MyCom.Read(result, 0, MyCom.BytesToRead); + // 将读取到的数据写入virtualCom + VirtualCom.Write(result, 0, result.Length); ReceiveData += Encoding.UTF8.GetString(result); if (ReceiveData.Contains('\r')) { message = ReceiveData.Replace("\r", "").Trim(); + SystemData.message = message; ReceiveData = ""; } @@ -86,6 +122,24 @@ namespace Khd.Core.Wpf.Scan } + private void virtualCom_DataReceived(object sender, SerialDataReceivedEventArgs e) + { + try + { + //读取串口缓冲区的字节数据,分两次传递结果 + byte[] result = new byte[VirtualCom.BytesToRead]; + VirtualCom.Read(result, 0, VirtualCom.BytesToRead); + + + } + catch (Exception ex) + { + LogManager.Error(ex); + } + + } + + /// /// 关闭串口 ///