using RJCP.IO.Ports;
using SHJX.Service.Common.ReadXML;
using SHJX.Service.ServerClient.RS485;
using SHJX.Service.Common.Logging;
using Microsoft.Extensions.Logging;
namespace SHJX.Service.ServerClient
{
public sealed class ClientPort
{
private readonly bool _isAuto;
private readonly string _port;
private static readonly ILogger logger = LogFactory.BuildLogger(typeof(ClientPort));
public ClientPort( ReadConfigUtil config)
{
_port = config.Port;
_isAuto = config.IsAutoGetPort;
}
///
/// 打开连接
///
///
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(_port);
}
return (Rs485Client.Sport.PortName, Rs485Client.IsValid);
}
///
/// 遍历所有COM口,查找鸣志电机通信口.
///
/// 电机RS485地址号
/// 找到的端口名,否则为string.Empty
private string FindMoonsMotor(char addr = '1')
{
var portName = string.Empty; // 记录找到的端口
foreach (var comport in SerialPortStream.GetPortNames())
{
Rs485Client.Open(comport);
if (!Rs485Client.IsValid) continue;
var strCmd = $"{addr}SC\r";
var strRes = Rs485Client.SendData(strCmd, '\r');
Rs485Client.Close();
if (string.IsNullOrEmpty(strRes) || !strRes.Contains("SC="))
continue;
portName = comport;// OK,找到端口
break;
}
return portName;
}
}
}