我有2个表格form1& form2。 Form1包含一个串行端口。此端口以表单加载方式打开。
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.Open();
}
我想通过form2写入串口。为此,我在form1中创建了一个函数,用于写入串口。
public void SerialPortValueUpdated()
{
byte[] head = new byte[1] { 0xAA };
byte[] trail = new byte[1] { 0x55 };
byte[] llen = new byte[1] { length };
// head = Convert.ToByte(0xAA);
//serialPort1.Open();
serialPort1.Write(head, 0, 1);
serialPort1.Write(llen, 0, 1);
serialPort1.Write(trail, 0, 1);
}
并从form2中调用此函数
private void button1_Click(object sender, EventArgs e)
{
Form1 F = new Form1();
F.SerialPortValueUpdated();
}
但是当我调用这个函数时,我得到一个“端口关闭”的错误。我该怎么解决这个问题。
请帮我。
答案 0 :(得分:1)
正如在另一个答案中所述,您在按钮单击事件中创建了一个新的Form1,而不是使用已经打开串行端口的表单。在我的系统中,我使用一个单独的类来封装通信逻辑,正如另一个答案中提到的那样。但是,由于这似乎是一个简单的应用程序,并且您现有的Form1作为Form2的创建它的知识,只需将form1作为Form2的所有者传递,这样您就可以访问您想要的函数。
即
f2 = new Form2();
f2.Show(this); // or f2.ShowDialog(this) if you want f2 to be Modal
然后,您可以在Form2的按钮中访问它。点击这样的内容。
private void button1_Click(object sender, EventArgs e)
{
((Form1)this.Owner).SerialPortValueUpdated();
}
<强> Form1中强>
public partial class Form1 : Form
{
Form2 f2;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
f2 = new Form2();
f2.ShowDialog(this); // or f2.Show(this) if you want f2 to be non Modal
}
public void SerialPortValueUpdated()
{
MessageBox.Show("Test");
}
}
<强>窗体2 强>
public partial class Form2 : Form
{
Form3 f3;
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
((Form1)this.Owner).SerialPortValueUpdated();
}
private void button2_Click(object sender, EventArgs e)
{
f3 = new Form3();
f3.ShowDialog(this.Owner);
}
}
<强> Form3 强>
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
((Form1)this.Owner).SerialPortValueUpdated();
}
}
答案 1 :(得分:0)
问题是创建新的Form1
永远不会打开您的端口,因为当表单加载时,Load
事件将被称为,并且只是新建一个表单不会加载或显示它。
更改此设置的最简单方法是将开头移动到构造函数中。
所以而不是
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.Open();
}
DO
public Form1()
{
serialPort1.Open();
}
话虽如此 - 使用Form
来做这种事情实际上并不是解决方案。而是使用一个简单的类来执行此操作并使调用者负责管理打开和关闭(或者如果您真的只想写几个字节然后在方法中打开并关闭它)。