从多个表单访问的串行端口数据接收事件

时间:2017-12-19 16:43:30

标签: c# forms serial-port

我试图在C#中使用Visual Studio制作Windows窗体应用程序,目的是能够与Arduino微控制器进行通信。现在我有2个表单(Form1和Form2),我需要从两个窗口向微控制器发送和接收数据。我已经定义了一个类SerialComms.cs,其中我启动了我的serialPort,并且我已经能够将这两种形式的消息发送到Arduino。

问题是我不知道如何在收到数据后立即从Arduino接收数据。如果我要从其中一个表单创建serialPort,我将能够为DataReceived创建一个函数,该函数将在收到数据时随时运行,但是当我从类中启动serialPort时,我不知道该怎么做。有什么帮助吗?

这是我的表单和我的serialComms类的代码:

Form1中

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;

namespace Test_Comms
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            connectToArduino();
        }

        void connectToArduino()
        {
            try { SerialComms.SerialPort.Close(); }
            catch { }
            getAvailablePorts();
            for (int i = 0; i < COMcomboBox.Items.Count; i++)
            {
                string inputMsg = "None";
                string commport = COMcomboBox.GetItemText(COMcomboBox.Items[i]);
                //Wait for Arduino message sent
                //If not receieved go to next port
                SerialComms.SerialPort.PortName = commport;
                SerialComms.SerialPort.BaudRate = 9600;
                SerialComms.SerialPort.Open();
                try { SerialComms.SerialPort.Open(); }
                catch { }

                int counter1 = 0;
                while (counter1 < 100)
                {
                    inputMsg = SerialComms.SerialPort.ReadLine();
                    try { inputMsg = SerialComms.SerialPort.ReadLine(); }
                    catch { }
                    counter1++;
                    if (inputMsg == "Arduino")
                    {
                        counter1 = 1000;
                    }
                }
                if (inputMsg != "Arduino")
                {
                    try { SerialComms.SerialPort.Close(); }
                    catch { }
                }
                else
                { 
                    i = COMcomboBox.Items.Count;
                    SerialComms.SerialPort.WriteLine("Connection Established");
                    toolStripStatusLabel1.Text = "Connected";

                    break;
                }
            }
        }
        void getAvailablePorts()
        {
            COMcomboBox.Items.Clear();
            String[] ports = SerialPort.GetPortNames();
            COMcomboBox.Items.AddRange(ports);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SerialComms.SerialPort.WriteLine("LED ON");
        }

        private void button2_Click(object sender, EventArgs e) 
        {
            SerialComms.SerialPort.WriteLine("LED OFF");
        }

        private void button3_Click(object sender, EventArgs e) //Opens second form
        {
            Form2 settingsForm = new Form2();
            settingsForm.ShowDialog();
         }
    }
}

窗体2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;

namespace Test_Comms
{
    public partial class Form2 : Form
    {
        public static string text = "Test text";
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SerialComms.SerialPort.WriteLine("LED ON");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            SerialComms.SerialPort.WriteLine("LED OFF");

            button2.Text = text;

         }

        private void Form2_Load(object sender, EventArgs e)
        {

        }
    }
}

SerialComms.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.IO;

namespace Test_Comms
{

    public static class SerialComms
    {
        //public static delegate void DataReceivedEventHandler(object sender, ReceivedEventArgs e);
        //public static event DataReceivedEventHandler DataReceived;

        private static SerialPort _serialPort = new SerialPort();



        public static SerialPort SerialPort
        {

            get { return _serialPort; }
            set { _serialPort = value; }
        }

    }
}

0 个答案:

没有答案