在使用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端口可用,若电脑没有可用端口,可以下载虚拟串口软件进行添加串口。
有问题欢迎留言!