You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#多窗体应用中如何跨窗体访问已打开的Serial Port

多窗体C#应用中共享已打开SerialPort的解决方案

问题背景

开发包含登录窗体、串口配置窗体(选择串口号、设置波特率)、主应用窗体的C#应用,流程为:登录成功→进入串口配置窗体→配置完成打开串口→跳转主窗体。目前遇到两个问题:

  1. 主窗体无法访问已配置打开的SerialPort实例
  2. 需要在主窗体显示当前使用的串口号和波特率

以下是串口配置窗体(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);
    this.Invoke(new EventHandler(ShowData));
}

解决方案

方案1:构造函数传递SerialPort实例(推荐)

通过修改主窗体构造函数,直接将已打开的SerialPort实例和配置信息传入,实现数据共享和显示。

步骤1:修改主窗体(Home.cs)代码

private SerialPort _serialPort;

// 重载构造函数,接收串口实例和配置参数
public Home(SerialPort serialPort, string portName, int baudRate)
{
    InitializeComponent();
    _serialPort = serialPort;
    
    // 在主窗体控件中显示串口号和波特率
    portStatusLabel.Text = $"当前串口:{portName}";
    baudStatusLabel.Text = $"波特率:{baudRate}";
}

// 主窗体中使用串口示例(如发送数据)
private void btnSendData_Click(object sender, EventArgs e)
{
    if (_serialPort != null && _serialPort.IsOpen)
    {
        _serialPort.Write("测试数据");
    }
}

步骤2:修改串口配置窗体(ComPort.cs)的打开按钮事件

private void btn_open_port_Click(object sender, EventArgs e)
{
    try
    {
        string portName = comPort_comboBox.Text;
        int baudRate = Convert.ToInt32(baud_rate_combobox.Text);
        
        serialPort1.PortName = portName;
        serialPort1.BaudRate = baudRate;
        serialPort1.Open();
        
        // 传递串口实例和配置信息到主窗体
        Home home = new Home(serialPort1, portName, baudRate);
        home.ShowDialog();
    }
    catch (Exception err)
    {
        MessageBox.Show(err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

方案2:静态类全局管理串口

创建静态类统一管理串口实例和配置信息,所有窗体可直接访问。

步骤1:创建串口管理静态类

public static class SerialPortManager
{
    // 全局串口实例
    public static SerialPort ActiveSerialPort { get; set; }
    // 当前串口配置信息
    public static string CurrentPortName { get; set; }
    public static int CurrentBaudRate { get; set; }
}

步骤2:修改串口配置窗体打开按钮事件

private void btn_open_port_Click(object sender, EventArgs e)
{
    try
    {
        string portName = comPort_comboBox.Text;
        int baudRate = Convert.ToInt32(baud_rate_combobox.Text);
        
        serialPort1.PortName = portName;
        serialPort1.BaudRate = baudRate;
        serialPort1.Open();
        
        // 存入静态类
        SerialPortManager.ActiveSerialPort = serialPort1;
        SerialPortManager.CurrentPortName = portName;
        SerialPortManager.CurrentBaudRate = baudRate;
        
        Home home = new Home();
        home.ShowDialog();
    }
    catch (Exception err)
    {
        MessageBox.Show(err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

步骤3:主窗体加载时读取配置并使用串口

private void Home_Load(object sender, EventArgs e)
{
    // 显示串口配置信息
    portStatusLabel.Text = $"当前串口:{SerialPortManager.CurrentPortName}";
    baudStatusLabel.Text = $"波特率:{SerialPortManager.CurrentBaudRate}";
}

// 主窗体中使用串口示例
private void btnReadData_Click(object sender, EventArgs e)
{
    if (SerialPortManager.ActiveSerialPort != null && SerialPortManager.ActiveSerialPort.IsOpen)
    {
        string data = SerialPortManager.ActiveSerialPort.ReadExisting();
        // 处理读取到的数据
    }
}

注意事项

  • 构造函数传递方式更符合封装原则,避免全局状态带来的潜在问题
  • 静态类方式实现简单,但需注意线程安全(尤其是串口数据接收的跨线程操作)
  • 无论采用哪种方式,都要在窗体关闭时检查串口状态,确保资源正确释放

内容的提问来源于stack exchange,提问作者Ethoss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 07:17:43