Задача заключается в следующем. Необходимо работать с двумя COM портами одновременно. Настройки портов разные как и имя порта. Методы для работы (чтение - запись) так же могут быть разными. Не понимаю архитектурно как это сделать. Создавать два почти идентичных класса для работы с портом, попахивает дублированием. Сейчас делаю так, но то же не понимаю, как можно в одном классе аккумулировать работу с двумя последовательными портами и инициализировать два разных порта с разными настройками. Класс настроек:
public class FirstPort
{
public string PortName { get; set; } = "COM1";
public int BaudRate { get; set; } = 38400;
public int DataBits { get; set; } = 8;
public StopBits StopBits { get; set; } = StopBits.One;
public Parity Parity {get;set;} = Parity.None;
}
public class SecondPort
{
public string PortName { get; set; } = "COM2";
public int BaudRate { get; set; } = 19200;
public int DataBits { get; set; } = 8;
public StopBits StopBits { get; set; } = StopBits.One;
public Parity Parity { get; set; } = Parity.None;
}
Основной класс:
public class CustomSerialPort : SerialPort
{
public event DataRecievedEventHandler DataChanged;
public delegate void DataRecievedEventHandler(object sender, string package);
private object locker = new object();
public CustomSerialPort(что - то port)
: base()
{
base.PortName = port.PortName;
base.BaudRate = port.BaudRate;
base.DataBits = port.DataBits;
base.StopBits = port.StopBits;
base.Parity = port.StopBits;
base.DataReceived += CustomSerialPortDataReceived; ;
}
public void Open(string portName)
{
if (base.IsOpen)
{
base.Close();
}
base.PortName = portName;
base.Open();
}
private void CustomSerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
var port = (SerialPort)sender;
lock (locker)
{
try
{
DataChanged?.Invoke(sender, port.ReadExisting());
}
catch (Exception exception)
{
Debug.WriteLine(exception);
}
}
}
}
Использование:
static void Main(string[] args)
{
var port = new CustomSerialPort();
port.Open("COM1");
port.DataChanged += Port_DataChanged;
Console.WriteLine(port.ReadExisting());
Console.ReadKey();
}
private static void Port_DataChanged(object sender, string package)
{
Console.Write(package.Replace("\r", "\n"));
}
Или перегрузить конструктор и в них передавать экземпляры FirstPort, SecondPort?
Здесь вообще не нужны классы FirstPort и SecondPort. Создайте в вашем классе CustomSerialPort конструктор с параметрами:
public CustomSerialPort(string port, int baud, int dataBits, StopBits stopBits, Parity parity)
{
PortName = port;
BaudRate = baud;
DataBits = dataBits;
StopBits = stopBits;
Parity = parity;
DataReceived += CustomSerialPortDataReceived;
}
А при использовании создайте два экземпляра с разными параметрами:
CustomSerialPort port1 = new CustomSerialPort("COM1", 38400, 8, StopBits.None, Parity.None);
CustomSerialPort port2 = new CustomSerialPort("COM2", 19200, 8, StopBits.None, Parity.None);
И используйте их как вам угодно. Если например, для них будет разная логика обработки в DataReceived, то в классе добавить второе такое событие, сделать их public static, убрать из конструктора DataReceived и назначать непосредственно объектам при использовании следующим образом:
port1.DataReceived += CustomSerialPort.CustomSerialPortDataReceived1;
port2.DataReceived += CustomSerialPort.CustomSerialPortDataReceived2;
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Столкнулся с проблемойПри программном открытии документа Word с шаблоном Unity крашится
Есть проект WebForms (legacy) + ASPNET MVC + SimpleInjector