using System.IO.Ports; namespace SHJX.Service.PortClient.OptionClient.RS485 { public class OperateRs485 { #region Field private readonly bool _isAuto; private readonly string _portName; #endregion #region Property public static string PortName => Rs485Client.Sport.PortName; public static bool PortState => Rs485Client.IsValid; #endregion public OperateRs485(string portName, bool autoPort) { _portName = portName; _isAuto = autoPort; } /// /// 打开连接 /// /// public (string, bool) OpenClient() { Rs485Client.InitPort(); if (Rs485Client.IsValid) { return (Rs485Client.Sport.PortName, Rs485Client.IsValid); } if (_isAuto) { var portStr = FindMoonsMotor(); if (string.IsNullOrWhiteSpace(portStr)) { return ("NULL", false); } Rs485Client.Open(portStr); } else { Rs485Client.Open(_portName); } return (Rs485Client.Sport.PortName, Rs485Client.IsValid); } /// /// 遍历所有COM口,查找鸣志电机通信口. /// /// 电机RS485地址号 /// 找到的端口名,否则为string.Empty private string FindMoonsMotor(char addr = '1') { string portName = string.Empty; // 记录找到的端口 foreach (string comport in SerialPort.GetPortNames()) { Rs485Client.Open(comport); if (!Rs485Client.IsValid) { continue; } var strCmd = $"{addr}SC\r"; var strRes = Rs485Client.SendData(strCmd, "\r"); Rs485Client.Close(); if (string.IsNullOrWhiteSpace(strRes) || !strRes.Contains("SC=")) { continue; } portName = comport;// OK,找到端口 break; } return portName; } } }