在多个函数中使用串口连接?

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的开头是字段声明,最后是使用该字段的虚拟函数