c# - 应用程序结构&将读取的串行数据传递回我的主表单

时间:2017-02-28 09:59:21

标签: c# forms winforms class serial-port

我想对我的Windows窗体应用程序的结构提出一些建议。我的应用程序将允许用户打开import { Connection } from 'tedious'; import { Request } from 'tedious'; var config = { userName: 'dbuser', password: 'dbpassword', server: 'mydatabase.database.windows.net', options: { instanceName: 'SQLEXPRESS', // Removed this line while deploying it on server as it has no instance. database: 'dbname' } }; connection = new Connection(config); connection.on('connect', function(err) { if (err) { console.log('error : '+err); } else { console.log("Connected to Database"); } }); 以便从USB设备读取数据。

目前,应用程序将打开到主窗体,然后用户将打开另一个窗体SerialPort以配置端口,然后将关闭此窗体并且用户将返回到主窗体。按照目前的情况,用户选择端口,单击打开,然后将端口信息传递到另一个端口配置类并进行设置。

然后我如何将此数据传回主表单?
这是实现这一目标的正确/最有效的方法吗?

端口配置表单

frmPortConfig

端口配置类:

public partial class frmPortConfig : Form
{
    public frmPortConfig()
    {
        InitializeComponent();

        //center the form
        this.CenterToScreen();
        //get serial ports
        getPorts();
    }

    public void getPorts()
    {
        //stop user from editing the combo box text
        cmbPortList.DropDownStyle = ComboBoxStyle.DropDownList;
        //get the available ports
        string[] ports = SerialPort.GetPortNames();
        //add the array of ports to the combo box within the 
        cmbPortList.Items.AddRange(ports);
    }


    private void btnOpenPort_Click(object sender, EventArgs e)
    {
        //get name of port
        string port = cmbPortList.SelectedItem.ToString();

        //if the port string is not null
        if (port != null)
        {
            //if port can be opened (evoke open port code in port class)
            if (clsPortConfig.openPort(port))
            {
                //inform user that port has been opened
                lblPortStatus.Text = port + " opened successfully";
            }
            else
            {
                //inform user that port could not be opened
                lblPortStatus.Text = port + " could not be opened";
            }
        }          
    }

    private void btnClose_Click(object sender, EventArgs e)
    {
        //close the form
        this.Close();
    }

我应该如何将收到的数据发回我的主表单?

由于

1 个答案:

答案 0 :(得分:1)

  

然后我如何将这些数据传回主表单?

由于您通过事件从设备异步捕获数据。你不知道它什么时候到来。所以你需要一个可以从clsPortConfig开始的事件。

class clsPortConfig
{

    public delegate void EventHandler(string s);
    public static event EventHandler TransmitEvent;

    // all the other stuff

    public static void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        //set sender up as serial port
        SerialPort serialPort = (SerialPort)sender;

        //get data from serial port
        string data = serialPort.ReadExisting();

        if (TransmitEvent != null)
        {
            TransmitEvent(data);
        }
    }

}

并以以下形式注册:

public frmPortConfig()
{
    InitializeComponent();

    //center the form
    this.CenterToScreen();
    //get serial ports
    getPorts();

    clsPortConfig.TransmitEvent += MyTransmitEvent;
}

private void MyTransmitEvent(string s)
{
    // in s you will find the data
}
  

这是实现这一目标的正确/最有效的方法吗?

我会怀疑。有很多方法可以做到这一点。你选择了一个相当复杂的人。最简单的可能是在Form课程中拥有所有内容。如果要显示收到的数据,请在SerialPort处注册DataReceived事件并使用BeginInvoke方法访问TextBox等显示控件。因为它将到达不同的线程,然后在。中创建控件。