C#多个窗体共享同一个SerialPort控件

在使用SerialPort控件时,能够发现虽然可以把它拖拽到窗口上,但它并不会显示在窗体上,而是在窗体的下面,这说明此控件并不是一个可视化的控件,类似的控件还有Timer。正是由于SerialPort的这种特性,使得我们可以不必采用拖拽的方式添加此控件,而是直接在代码中添加。
现在有两个窗体,分别是Form1和Form2,其中Form1是主窗体,现在想要在Form1中打开串口,然后在Form2中进行串口写数据。
Step1
在Form1的代码中添加SerialPort

 public static SerialPort serialPort1 = new SerialPort();

Step2
在Form2中可以直接通过Form1.serialPort1的方式使用。

上面是一种方法,还可以把SerialPort写到一个静态类里

 public static class CommonRes
        {
            public static SerialPort serialPort2 = new SerialPort();
        }

用的时候只需要加上此静态类的命名空间,然后使用CommonRes.serialPort2调用就可以了。
比如说我把这个静态类写到了Form1窗体的代码中,那么如果想要在Form2 中使用SerialPort2,需要先在Form2的代码中加入引用:

using static ShareDemo.Form1;

整个Demo的代码如下
Form1

using System;
using System.IO.Ports;
using System.Windows.Forms;
namespace ShareDemo
{
    public partial class Form1 : Form
    {
        Form2 form2 = new Form2();
        public Form1()
        {
            InitializeComponent();
        }
        public static SerialPort serialPort1 = new SerialPort();

        public static class CommonRes
        {
            public static SerialPort serialPort2 = new SerialPort();
        }
      
        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM1";  //默认打开串口1
            CommonRes.serialPort2.PortName = "COM2";
            try
            {
                serialPort1.Open();
                CommonRes.serialPort2.Open();
            }
            catch
            {
                MessageBox.Show("串口打开失败");
                return;
            }
            form2.ShowDialog();
        }
    }
}

Form2

using System;
using System.Windows.Forms;
using static ShareDemo.Form1;

namespace ShareDemo
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
     
        private void button1_Click(object sender, EventArgs e)
        {
            byte[] myByte = new byte[1];
            myByte[0] = Convert.ToByte(textBox1.Text);
            Form1.serialPort1.Write(myByte, 0, 1);
            CommonRes.serialPort2.Write(myByte, 0, 1);
        }
    }
}

程序下载地址:https://download.csdn.net/download/weixin_43074474/11589751
注:运行时要保证电脑上的COM1和COM2端口可用,若电脑没有可用端口,可以下载虚拟串口软件进行添加串口。
有问题欢迎留言!

C#中创建一个窗体程序处理多个串口的接收和发送,你需要做的是首先安装`System.IO.Ports`命名空间来访问串口功能,然后编写一个包含多个串口实例的类,并在窗体上添加控件来管理每个串口的状态。下面是一个简化的示例代码: ```csharp using System; using System.IO.Ports; using System.Threading; public partial class MainForm : Form { private SerialPort[] serialPorts = new SerialPort[2]; // 假设最多有两个串口 public MainForm() { InitializeComponent(); // 初始化串口设置 for (int i = 0; i < serialPorts.Length; i++) { serialPorts[i] = new SerialPort(); serialPorts[i].Name = $"SerialPort_{i + 1}"; serialPorts[i].DataReceived += SerialPort_DataReceived; // 注册数据接收事件 } } private void btnConnect_Click(object sender, EventArgs e) { foreach (SerialPort port in serialPorts) { if (!port.IsOpen) // 如果串口未打开 { try { port.Open(); // 尝试打开串口 btnConnect.Enabled = false; // 防止多次连接 Console.WriteLine($"Connected to {port.Name}"); } catch (Exception ex) { MessageBox.Show($"Failed to open {port.Name}: {ex.Message}"); } } } } private void btnSend_Click(object sender, EventArgs e) { string data = txtMessage.Text; if (selectedPort.SelectedIndex != -1) // 确保选择了串口 { SerialPort selectedPort = serialPorts[selectedPort.SelectedIndex]; if (selectedPort.IsOpen) { selectedPort.Write(data); Console.WriteLine($"Sent message to {selectedPort.Name}: {data}"); } } } private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { SerialPort port = (SerialPort)sender; byte[] buffer = new byte[port.BytesToRead]; port.Read(buffer, 0, buffer.Length); textBoxSerialOutput.AppendText($"{DateTime.Now.ToString("HH:mm:ss")} - {port.Name}: {BitConverter.ToString(buffer)}\n"); } }
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值