我正在编写一个旨在从串行端口读取的应用程序,然后在图形上绘制数据并将其保存到日志文件中。到目前为止,我正在进行初始串口设置和打开/关闭。
有一个组合框可以选择要使用的串口,还有一个用于连接/断开的按钮。是否断开串口重要或者窗口是否在应用程序关闭时自动执行此操作?
以下是代码:
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”。从其他功能访问此端口的最佳解决方案是什么?
答案 0 :(得分:1)
我建议你阅读范围 - 但基本上你是在Connect方法中创建一个端口。此变量是此方法的本地变量,其他方法(例如btnConnect_Click!)无法查看或访问它。我建议你让port变量成为MainForm的一个类成员(声明它与你的方法,MainForm_Load在同一级别) - 这样所有类方法都可以访问变量:
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();
}
}
}
答案 1 :(得分:1)
假设您的代码正确且有效,唯一要做的就是将变量端口从本地转换为函数,再转换为类的字段。这是一个可能的解决方案:
errorfname
注意在类的开头,有字段声明,最后是有使用该字段的虚函数。