c# 使用线程对串口serialPort进行收发数据(四种)

 更新时间:2022年07月22日 10:48:28   作者:雪墩墩  
本文主要介绍了c# 使用线程对串口serialPort进行收发数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

本文主要介绍了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收发数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于C#实现获取本地磁盘目录

    基于C#实现获取本地磁盘目录

    这篇文章主要为大家详细介绍了如何利用C#实现获取本地磁盘目录的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C#二维数组与多维数组的具体使用

    C#二维数组与多维数组的具体使用

    本文主要介绍了C#二维数组与多维数组的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 轻松学习C#的结构和类

    轻松学习C#的结构和类

    轻松学习C#的结构和类,对C#的结构和类感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的结构和类
    2015-11-11
  • c# 如何实现自动更新程序

    c# 如何实现自动更新程序

    这篇文章主要介绍了如何用c# 自动更新程序,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#中定时任务被阻塞问题的解决方法

    C#中定时任务被阻塞问题的解决方法

    这篇文章主要给大家介绍了关于C#中定时任务被阻塞问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友可以参考下
    2021-11-11
  • C#使用GUID(全局统一标识符)

    C#使用GUID(全局统一标识符)

    这篇文章介绍了C#使用GUID(全局统一标识符)的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#难点逐个击破(4):main函数

    C#难点逐个击破(4):main函数

    貌似我是在写C#的学习笔记哦,不过反正可以利用这个机会来好好温习下基础知识,这其中很多知识点都属于平时视而见的小知识
    2010-02-02
  • 详解C#通过反射获取对象的几种方式比较

    详解C#通过反射获取对象的几种方式比较

    本文主要介绍了C#通过反射获取对象的几种方式比较,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C#如何优雅的结束线程

    C#如何优雅的结束线程

    这篇文章主要介绍了C#如何优雅的结束一个线程,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • C#获取根目录实现方法汇总

    C#获取根目录实现方法汇总

    这篇文章主要介绍了C#获取根目录实现方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论