Работа с двумя SerialPort C# .NET

117
29 ноября 2019, 03:00

Задача заключается в следующем. Необходимо работать с двумя 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?

Answer 1

Здесь вообще не нужны классы 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;
READ ALSO
Unity крашится при открытии документа Word

Unity крашится при открытии документа Word

Столкнулся с проблемойПри программном открытии документа Word с шаблоном Unity крашится

123
NRE на переменных класса MVC controller'а

NRE на переменных класса MVC controller'а

Есть проект WebForms (legacy) + ASPNET MVC + SimpleInjector

128
Регистронезависимый switch

Регистронезависимый switch

Есть у меня фрагмент кода в котором я хочу заменить if на switch:

134