在多个功能中使用串口连接?

时间:2016-02-04 16:00:34

标签: c# serial-port port

我正在编写一个旨在从串行端口读取的应用程序,然后在图形上绘制数据并将其保存到日志文件中。到目前为止,我正在进行初始串口设置和打开/关闭。

有一个组合框可以选择要使用的串口,还有一个用于连接/断开的按钮。是否断开串口重要或者窗口是否在应用程序关闭时自动执行此操作?

以下是代码:

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”。从其他功能访问此端口的最佳解决方案是什么?

2 个答案:

答案 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

注意在类的开头,有字段声明,最后是有使用该字段的虚函数。