winforms 如何将一个窗体打开的串口访问到另一个窗体

cbeh67ev  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(148)

我有一个应用程序,其中有三种形式之一的登录,成功登录后,用户将被发送到选择comport和设置波特率的串行端口后,他们将被发送到主应用程序与串行端口,这是在以前的形式配置.
我不知道我该怎么把那个串口连接到另一个。我对C#还很陌生
这是我的ComPort.cs

private void ComPort_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            comPort_comboBox.Items.AddRange(ports);
        }

        private void btn_open_port_Click(object sender, EventArgs e)
        {
            try
            {

                serialPort1.PortName = comPort_comboBox.Text;
                string comportlabel= comPort_comboBox.Text;
                serialPort1.BaudRate = Convert.ToInt32(baud_rate_combobox.Text);
                string baudlabel = baud_rate_combobox.Text;
                serialPort1.Open();
                Home home = new Home();
                home.ShowDialog();
                
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            serialPort1.Read(Data_rx, 0, serialPort1.BytesToRead);//.ToString();
            this.Invoke(new EventHandler(ShowData));
        }

我想显示comport和波特率,就像这样

我在一个表单中创建了这个应用程序,所以处理serialport不是问题,但现在的要求是不同的,我现在有三个表单。

enyaitl3

enyaitl31#

有几种可能性来解决你的问题。
可以像这样更改Home表单构造函数

public Home(string portName, int baudRate)

从第二种形式调用它

Home home = new Home(
    comPort_comboBox.Text,
    Convert.ToInt32(baud_rate_combobox.Text));

有了这个,你可以直接在第三种形式内管理串行端口(因此打开它内部的端口并设置事件以接收其中的数据),而无需共享其示例(可能导致其他问题恕我直言)。
如果您需要以某种方式管理串行端口,即使是在第二种形式中,那么您可以更改第三种形式的构造函数来传递它:

public Home(SerialPort serialPort)

并将其命名为Home home = new Home(serialPort1);

chhkpiq4

chhkpiq42#

1.您可以在SerialPortConfig.cs中使用save the serial port config

  1. Read the serial port configSerialPortConfig.cs,而您在MainForm.cs
    SerialPortConfig.cs
using System.IO.Ports;

namespace SerialPortNs
{
    public class SerialPortConfig
    {
        private static readonly SerialPortConfig _instance = new SerialPortConfig();

        private SerialPortConfig()
        {
            //
        }

        public static SerialPortConfig Instance()
        {
            return _instance;
        }

        public string? PortName { get; set; }
        public int BaudRate { get; set; }
        public Parity Parity { get; set; }
        public int DataBits { get; set; }
        public StopBits StopBits { get; set; }
        public Handshake Handshake { get; set; }
    }
}

SettingsForm.cs

using System.IO.Ports;

namespace SerialPortNs
{
    public partial class SettingsForm : Form
    {
        public SettingsForm()
        {
            InitializeComponent();

            // save serial port config
            SerialPortConfig config = SerialPortConfig.Instance();
            config.PortName = "COM1";
            config.BaudRate = 9600;
            config.Parity = Parity.None;
            config.DataBits = 8;
            config.StopBits = StopBits.One;
            config.Handshake = Handshake.None;

            // open MainForm
            Application.Run(new MainForm());
            
            // hide SettingsForm
            this.Hide();
        }
    }
}

MainForm.cs

using System.IO.Ports;

namespace SerialPortNs
{
    public partial class MainForm : Form
    {
        private SerialPort _serialPort = new SerialPort();

        public MainForm()
        {
            InitializeComponent();

            // read serial port config
            SerialPortConfig config = SerialPortConfig.Instance();
            _serialPort.PortName = config.PortName;
            _serialPort.BaudRate = config.BaudRate;
            _serialPort.Parity = config.Parity;
            _serialPort.DataBits = config.DataBits;
            _serialPort.StopBits = config.StopBits;
            _serialPort.Handshake = config.Handshake;

            if (_serialPort.IsOpen)
            {
                _serialPort.Close();
            }
            _serialPort.Open();
        }
    }
}

Program.cs

namespace SerialPortNs
{
    internal static class Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>

        [STAThread]
        static void Main()
        {
            ApplicationConfiguration.Initialize();

            // Open SettingsForm on startup
            Application.Run(new SettingsForm());
        }
    }
}

相关问题