首頁 > 軟體

c# 使用執行緒對串列埠serialPort進行收發資料(四種)

2022-07-22 14:00:15

本文主要介紹了c# 使用執行緒對串列埠serialPort進行收發資料,分享給大家,具體如下:

一共寫了四種方法,表單介面都是一樣的:

方法一:

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

namespace serialPort_0620
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //不進行跨執行緒安全檢查
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //檢查是否含有串列埠
            string[] str = SerialPort.GetPortNames();
            for (int i = 0; i < str.Length; i++)
            {
                comboBox1.Items.Add(str[i]);
            }
            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
            dataGridView1.Rows.Add(68);
            //標序號
            for (int i = 0; i < 69; i++)
            {
                dataGridView1.Rows[i].Cells[0].Value = i;
            }
        }
        /// <summary>
        /// 開啟串列埠
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                MessageBox.Show("串列埠已開啟");
            }
            else if (comboBox1.Text == "")
            {
                MessageBox.Show("請選擇埠!");
            }
            else if (textBox1.Text == "")
            {
                MessageBox.Show("請輸入波特率!");
            }

            else
            {
                serialPort1.PortName = comboBox1.Text;
                serialPort1.BaudRate = Convert.ToInt16(textBox1.Text);
                serialPort1.Open();
                button1.Enabled = false;
                button2.Enabled = true;
                button3.Enabled = true;
                button4.Enabled = true;
            }


        }

        /// <summary>
        /// 傳送資料
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            {
                MessageBox.Show("請輸入要傳送的資料");
            }
            else
            {
                serialPort1.WriteLine(textBox2.Text);
                string data = serialPort1.ReadLine();
                listBox1.Items.Add(data);
                int a = listBox1.Items.Count;
                listBox1.SelectedIndex = listBox1.Items.Count - 1;
            }
        }


        /// <summary>
        /// 接收資料
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {

        }


        /// <summary>
        /// 關閉串列埠
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            button1.Enabled = true;
        }


        Thread thread;


        /// <summary>
        /// 開始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            if (false == serialPort1.IsOpen)
            {
                MessageBox.Show("埠未開啟");
            }
            else
            {
                thread = new Thread(new ThreadStart(PrintEven));
                thread.Start();
            }
        }

        private void PrintEven()
        {
            while (true)
            {
                if (textBox2.Text == "")
                {
                    MessageBox.Show("請輸入要傳送的資料");
                }
                else
                {
                    if (serialPort1.IsOpen)
                    {
                        serialPort1.WriteLine(textBox2.Text);
                        string data = serialPort1.ReadLine();
                        listBox1.Items.Add(data);
                        listBox1.SelectedIndex = listBox1.Items.Count - 1;
                        for (int i = 0; i < 47; i++)
                        {
                            string[] result = data.Split(',');
                            dataGridView1.Rows[i].Cells[1].Value = result[i + 1];
                            dataGridView1.Rows[i].Cells[2].Value = Convert.ToDouble(result[i + 1]) * 5.0 / 1024.0;
                        }
                    }
                    Thread.Sleep(5000);
                }

            }
        }


        /// <summary>
        /// 結束
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button6_Click(object sender, EventArgs e)
        {
            thread.Abort();
        }
    }
}

//不進行跨執行緒安全檢查

方法二:

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

namespace serialPort_0620
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
         
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            string[] str = SerialPort.GetPortNames();
            for (int i = 0; i < str.Length; i++)
            {
                comboBox1.Items.Add(str[i]);
            }
            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
            dataGridView1.Rows.Add(68);
            //標序號
            for (int i = 0; i < 69; i++)
            {
                dataGridView1.Rows[i].Cells[0].Value = i;
            }
        }
        /// <summary>
        /// 開啟串列埠
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                MessageBox.Show("串列埠已開啟");
            }
            else if (comboBox1.Text == "")
            {
                MessageBox.Show("請選擇埠!");
            }
            else if (textBox1.Text == "")
            {
                MessageBox.Show("請輸入波特率!");
            }

            else
            {
                serialPort1.PortName = comboBox1.Text;
                serialPort1.BaudRate = Convert.ToInt16(textBox1.Text);
                serialPort1.Open();
                button1.Enabled = false;
                button2.Enabled = true;
                button3.Enabled = true;
                button4.Enabled = true;
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            button1.Enabled = true;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            {
                MessageBox.Show("請輸入要傳送的資料");
            }
            else
            {
                serialPort1.WriteLine(textBox2.Text);
               
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            string data = serialPort1.ReadLine();
            listBox1.Items.Add(data);
            int a = listBox1.Items.Count;
            listBox1.SelectedIndex = listBox1.Items.Count - 1;
        }
        //建立執行緒
        Thread thread;

        //建立委託

        public delegate void SetTextHandler(string result);
        private void setItem(string result)
        {
            if (listBox1.InvokeRequired == true)
            {
                SetTextHandler setTextHandler = setItem;
                listBox1.Invoke(setTextHandler, new object[] { result });
            }
            else
            {

                listBox1.Items.Add(result);
                listBox1.SelectedIndex = listBox1.Items.Count - 1;
            }

        }


        private void button5_Click(object sender, EventArgs e)
        {
            if (false == serialPort1.IsOpen)
            {
                MessageBox.Show("埠未開啟");
            }
            else
            {
                thread = new Thread(new ThreadStart(PrintEven));
                thread.Start();
            }
        }


       private void PrintEven()
        {
            while (true)
            {
                if (textBox2.Text == "")
                {
                    MessageBox.Show("請輸入要傳送的資料");
                }
                else
                {
                    if (serialPort1.IsOpen)
                    {
                        serialPort1.WriteLine(textBox2.Text);
                        string data = serialPort1.ReadLine();
                        setItem(data);
                        for (int i = 0; i < 47; i++)
                        {
                            string[] result = data.Split(',');
                             dataGridView1 .Rows[i].Cells[1].Value = result[i + 1];
                            dataGridView1.Rows[i].Cells[2].Value = Convert.ToDouble(result[i + 1]) * 5.0 / 1024.0;
                        }
                    }

                    Thread.Sleep(5000);
                }

            }
        }



        /// <summary>
        /// 結束
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button6_Click(object sender, EventArgs e)
        {
            thread.Abort();
        }
    }
}
// 建立委託 (參考網上  很規範的寫法)

方法三:

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

namespace serialPort_0620
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        private void Form3_Load(object sender, EventArgs e)
        {
            string[] str = SerialPort.GetPortNames();
            for (int i = 0; i < str.Length; i++)
            {
                comboBox1.Items.Add(str[i]);
            }
            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
            dataGridView1.Rows.Add(68);
            //標序號
            for (int i = 0; i < 69; i++)
            {
                dataGridView1.Rows[i].Cells[0].Value = i;
            }
        }

        /// <summary>
        /// 開啟串列埠
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                MessageBox.Show("串列埠已開啟");
            }
            else if (comboBox1.Text == "")
            {
                MessageBox.Show("請選擇埠!");
            }
            else if (textBox1.Text == "")
            {
                MessageBox.Show("請輸入波特率!");
            }

            else
            {
                serialPort1.PortName = comboBox1.Text;
                serialPort1.BaudRate = Convert.ToInt16(textBox1.Text);
                serialPort1.Open();
                button1.Enabled = false;
                button2.Enabled = true;
                button3.Enabled = true;
                button4.Enabled = true;
            }

        }

        /// <summary>
        /// 關閉串列埠
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {

            serialPort1.Close();
            button1.Enabled = true;
        }
        /// <summary>
        /// 傳送資料
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            {
                MessageBox.Show("請輸入要傳送的資料");
            }
            else
            {
                serialPort1.WriteLine(textBox2.Text);

            }
        }
        /// <summary>
        /// 接收資料
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {

            string data = serialPort1.ReadLine();
            listBox1.Items.Add(data);
            int a = listBox1.Items.Count;
            listBox1.SelectedIndex = listBox1.Items.Count - 1;
        }
        //建立執行緒
        Thread thread;
        /// <summary>
        /// 開始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            if (false == serialPort1.IsOpen)
            {
                MessageBox.Show("埠未開啟");
            }
            else
            {
                thread = new Thread(new ThreadStart(PrintEven));
                thread.Start();
            }
        }

        private void PrintEven()
        {
            while (true)
            {
                if (textBox2.Text == "")
                {
                    MessageBox.Show("請輸入要傳送的資料");
                }
                else
                {
                    if (serialPort1.IsOpen)
                    {
                        serialPort1.WriteLine(textBox2.Text);
                        string data = serialPort1.ReadLine();
                        //setItem(data);
                       
                        listBox1.Invoke(new Action(()=> {
                            listBox1.Items.Add(data);
                            listBox1.SelectedIndex = listBox1.Items.Count - 1;
                            for (int i = 0; i < 47; i++)
                            {
                                string[] result = data.Split(',');
                                dataGridView1.Rows[i].Cells[1].Value = result[i + 1];
                                dataGridView1.Rows[i].Cells[2].Value = Convert.ToDouble(result[i + 1]) * 5.0 / 1024.0;
                            }

                        }));

                    }

                    Thread.Sleep(5000);
                }

            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            
        }
    }
}
//第二種委託 更常用

方法四:

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.Threading;
using System.IO.Ports;

namespace serialPort_0620
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }

        private void Form4_Load(object sender, EventArgs e)
        {
            string[] str = SerialPort.GetPortNames();
            for (int i = 0; i < str.Length; i++)
            {
                comboBox1.Items.Add(str[i]);
            }
            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
            dataGridView1.Rows.Add(68);
            //標序號
            for (int i = 0; i < 69; i++)
            {
                dataGridView1.Rows[i].Cells[0].Value = i;
            }
        }

        /// <summary>
        /// 開啟串列埠
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                MessageBox.Show("串列埠已開啟");
            }
            else if (comboBox1.Text == "")
            {
                MessageBox.Show("請選擇埠!");
            }
            else if (textBox1.Text == "")
            {
                MessageBox.Show("請輸入波特率!");
            }

            else
            {
                serialPort1.PortName = comboBox1.Text;
                serialPort1.BaudRate = Convert.ToInt16(textBox1.Text);
                serialPort1.Open();
                button1.Enabled = false;
                button2.Enabled = true;
                button3.Enabled = true;
                button4.Enabled = true;
            }
        }

        /// <summary>
        /// 關閉串列埠
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            button1.Enabled = true;
        }

        /// <summary>
        /// 傳送資料
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            {
                MessageBox.Show("請輸入要傳送的資料");
            }
            else
            {
                serialPort1.WriteLine(textBox2.Text);

            }
        }

        /// <summary>
        /// 接收資料
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            string data = serialPort1.ReadLine();
            listBox1.Items.Add(data);
            int a = listBox1.Items.Count;
            listBox1.SelectedIndex = listBox1.Items.Count - 1;
        }


        //建立執行緒
        Thread thread;
        /// <summary>
        /// 開始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            if (false == serialPort1.IsOpen)
            {
                MessageBox.Show("埠未開啟");
            }
            else
            {
                thread = new Thread(new ThreadStart(PrintEven));
                thread.Start();
            }

        }

        private void PrintEven()
        {
            while (true)
            {
                if (textBox2.Text == "")
                {
                    MessageBox.Show("請輸入要傳送的資料");
                }
                else
                {
                    if (serialPort1.IsOpen)
                    {
                        
                        listBox1.Invoke(new Action(set));

                    }

                    Thread.Sleep(5000);
                }

            }
        }
        void set()
        {
            serialPort1.WriteLine(textBox2.Text);
            string data = serialPort1.ReadLine();
            listBox1.Items.Add(data);
            listBox1.SelectedIndex = listBox1.Items.Count - 1;
            for (int i = 0; i < 47; i++)
            {
                string[] result = data.Split(',');
                dataGridView1.Rows[i].Cells[1].Value = result[i + 1];
                dataGridView1.Rows[i].Cells[2].Value = Convert.ToDouble(result[i + 1]) * 5.0 / 1024.0;
            }



        }



        /// <summary>
        /// 結束
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button6_Click(object sender, EventArgs e)
        {
            thread.Abort();
        }
    }
}
//建立委託,invoke的第二種寫法

到此這篇關於c# 使用執行緒對串列埠serialPort進行收發資料(四種)的文章就介紹到這了,更多相關c# 串列埠serialPort收發資料內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com