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;
}
}
}