在多个函数中使用串口连接?
Using serial port connection in multiple functions?
我正在编写一个应用程序,旨在从串行端口读取数据,然后将数据绘制在图表上并将其保存到日志文件中。到目前为止,我正在处理初始串行端口设置和 opening/closing.
有一个组合框 select 要使用的串口,还有一个按钮 connect/disconnect。从串行端口断开连接很重要还是 windows 在应用程序关闭时自动执行此操作?
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace FieldProbe
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
var ports = SerialPort.GetPortNames();
cmbSerialPorts.DataSource = ports;
}
private void btnConnect_Click(object sender, EventArgs e)
{
if (btnConnect.Text == "Connect")
{
btnConnect.Text = "Disconnect";
if (cmbSerialPorts.SelectedIndex > -1)
{
MessageBox.Show(String.Format("You selected port '{0}'", cmbSerialPorts.SelectedItem));
Connect(cmbSerialPorts.SelectedItem.ToString());
}
else
{
MessageBox.Show("Please select a port first");
}
}
else
{
btnConnect.Text = "Connect";
port.Close();
}
}
private void Connect(string portName)
{
var port = new SerialPort(portName);
if (!port.IsOpen)
{
port.BaudRate = 921600;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.Handshake = Handshake.None;
port.Open();
}
}
}
}
这是从几个例子中无耻地摘录的,我不是专家编码员。 "port.close" 行不起作用,似乎我无法从 "Connect" 以外的任何函数访问 "port"。从其他功能访问此端口的最佳解决方案是什么?
我建议您仔细阅读范围 - 但基本上您是在 Connect 方法中创建一个端口。此变量是此方法的本地变量,其他方法(例如 btnConnect_Click!)无法查看或访问它。我建议您将端口变量设为 MainForm 的 class 成员(将其声明在与您的方法相同的级别,MainForm_Load)——这样所有 class 方法都可以访问该变量:
public partial class MainForm : Form
{
SerialPort _port;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
var ports = SerialPort.GetPortNames();
cmbSerialPorts.DataSource = ports;
}
private void btnConnect_Click(object sender, EventArgs e)
{
if (btnConnect.Text == "Connect")
{
btnConnect.Text = "Disconnect";
if (cmbSerialPorts.SelectedIndex > -1)
{
MessageBox.Show(String.Format("You selected port '{0}'", cmbSerialPorts.SelectedItem));
Connect(cmbSerialPorts.SelectedItem.ToString());
}
else
{
MessageBox.Show("Please select a port first");
}
}
else
{
btnConnect.Text = "Connect";
_port.Close();
}
}
private void Connect(string portName)
{
_port = new SerialPort(portName);
if (!_port.IsOpen)
{
_port.BaudRate = 921600;
_port.DataBits = 8;
_port.StopBits = StopBits.One;
_port.Parity = Parity.None;
_port.Handshake = Handshake.None;
_port.Open();
}
}
}
假设你的代码是正确的并且可以工作,唯一要做的就是将变量端口从本地到函数转换到class的一个字段。这里有一个可能的解决方案:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace FieldProbe
{
public partial class MainForm : Form
{
private SerialPort port;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
var ports = SerialPort.GetPortNames();
cmbSerialPorts.DataSource = ports;
}
private void btnConnect_Click(object sender, EventArgs e)
{
if (btnConnect.Text == "Connect")
{
btnConnect.Text = "Disconnect";
if (cmbSerialPorts.SelectedIndex > -1)
{
MessageBox.Show(String.Format("You selected port '{0}'", cmbSerialPorts.SelectedItem));
Connect(cmbSerialPorts.SelectedItem.ToString());
}
else
{
MessageBox.Show("Please select a port first");
}
}
else
{
btnConnect.Text = "Connect";
port.Close();
}
}
private void Connect(string portName)
{
port = new SerialPort(portName);
if (!port.IsOpen)
{
port.BaudRate = 921600;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.Handshake = Handshake.None;
port.Open();
}
}
private void OtherFunction()
{
if (port == null || !port.IsOpen)
return;
// HERE DO WHATEVER YOU WANT WITH port
}
}
}
注意class的开头是字段声明,最后是使用该字段的虚拟函数
我正在编写一个应用程序,旨在从串行端口读取数据,然后将数据绘制在图表上并将其保存到日志文件中。到目前为止,我正在处理初始串行端口设置和 opening/closing.
有一个组合框 select 要使用的串口,还有一个按钮 connect/disconnect。从串行端口断开连接很重要还是 windows 在应用程序关闭时自动执行此操作?
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace FieldProbe
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
var ports = SerialPort.GetPortNames();
cmbSerialPorts.DataSource = ports;
}
private void btnConnect_Click(object sender, EventArgs e)
{
if (btnConnect.Text == "Connect")
{
btnConnect.Text = "Disconnect";
if (cmbSerialPorts.SelectedIndex > -1)
{
MessageBox.Show(String.Format("You selected port '{0}'", cmbSerialPorts.SelectedItem));
Connect(cmbSerialPorts.SelectedItem.ToString());
}
else
{
MessageBox.Show("Please select a port first");
}
}
else
{
btnConnect.Text = "Connect";
port.Close();
}
}
private void Connect(string portName)
{
var port = new SerialPort(portName);
if (!port.IsOpen)
{
port.BaudRate = 921600;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.Handshake = Handshake.None;
port.Open();
}
}
}
}
这是从几个例子中无耻地摘录的,我不是专家编码员。 "port.close" 行不起作用,似乎我无法从 "Connect" 以外的任何函数访问 "port"。从其他功能访问此端口的最佳解决方案是什么?
我建议您仔细阅读范围 - 但基本上您是在 Connect 方法中创建一个端口。此变量是此方法的本地变量,其他方法(例如 btnConnect_Click!)无法查看或访问它。我建议您将端口变量设为 MainForm 的 class 成员(将其声明在与您的方法相同的级别,MainForm_Load)——这样所有 class 方法都可以访问该变量:
public partial class MainForm : Form
{
SerialPort _port;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
var ports = SerialPort.GetPortNames();
cmbSerialPorts.DataSource = ports;
}
private void btnConnect_Click(object sender, EventArgs e)
{
if (btnConnect.Text == "Connect")
{
btnConnect.Text = "Disconnect";
if (cmbSerialPorts.SelectedIndex > -1)
{
MessageBox.Show(String.Format("You selected port '{0}'", cmbSerialPorts.SelectedItem));
Connect(cmbSerialPorts.SelectedItem.ToString());
}
else
{
MessageBox.Show("Please select a port first");
}
}
else
{
btnConnect.Text = "Connect";
_port.Close();
}
}
private void Connect(string portName)
{
_port = new SerialPort(portName);
if (!_port.IsOpen)
{
_port.BaudRate = 921600;
_port.DataBits = 8;
_port.StopBits = StopBits.One;
_port.Parity = Parity.None;
_port.Handshake = Handshake.None;
_port.Open();
}
}
}
假设你的代码是正确的并且可以工作,唯一要做的就是将变量端口从本地到函数转换到class的一个字段。这里有一个可能的解决方案:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace FieldProbe
{
public partial class MainForm : Form
{
private SerialPort port;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
var ports = SerialPort.GetPortNames();
cmbSerialPorts.DataSource = ports;
}
private void btnConnect_Click(object sender, EventArgs e)
{
if (btnConnect.Text == "Connect")
{
btnConnect.Text = "Disconnect";
if (cmbSerialPorts.SelectedIndex > -1)
{
MessageBox.Show(String.Format("You selected port '{0}'", cmbSerialPorts.SelectedItem));
Connect(cmbSerialPorts.SelectedItem.ToString());
}
else
{
MessageBox.Show("Please select a port first");
}
}
else
{
btnConnect.Text = "Connect";
port.Close();
}
}
private void Connect(string portName)
{
port = new SerialPort(portName);
if (!port.IsOpen)
{
port.BaudRate = 921600;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.Handshake = Handshake.None;
port.Open();
}
}
private void OtherFunction()
{
if (port == null || !port.IsOpen)
return;
// HERE DO WHATEVER YOU WANT WITH port
}
}
}
注意class的开头是字段声明,最后是使用该字段的虚拟函数