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

作者:雪墩墩 时间:2023-06-20 13:05:48 

本文主要介绍了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的第二种写法

来源:https://blog.csdn.net/qq_42607586/article/details/125413119

标签:c#,串口,serialPort,收发数据
0
投稿

猜你喜欢

  • React Native与Android 原生通信的方法

    2021-08-11 19:02:56
  • java Springboot实现教务管理系统

    2023-01-18 00:28:12
  • Java编程实现统计一个字符串中各个字符出现次数的方法

    2023-01-24 18:02:20
  • Android使用Retrofit上传文件功能

    2022-08-28 08:42:38
  • 简单了解JAVA public class与class区别

    2023-11-15 23:59:26
  • SpringBoot实现PPT格式文件上传并在线预览功能

    2023-07-22 14:44:56
  • Java8使用stream实现list中对象属性的合并(去重并求和)

    2023-06-23 13:44:40
  • Spring计划任务用法实例详解

    2021-08-03 11:41:08
  • 在C#程序中对MessageBox进行定位的方法

    2022-03-04 18:45:26
  • Android rom解包打包工具

    2023-09-01 21:49:10
  • C#中常用的正则表达式

    2023-10-15 21:10:42
  • Mybatis中and和循环or混用操作(or转换成in)

    2023-09-19 11:08:34
  • Java StringBuffer与StringBuilder有什么区别

    2022-12-15 22:35:12
  • Flutter实现自定义搜索框AppBar的示例代码

    2021-10-26 02:37:54
  • C#使用BackgroundWorker控件

    2022-10-25 05:06:35
  • Android开发之WebView组件的使用解析

    2022-07-22 21:52:15
  • 基于SpringBoot核心原理(自动配置、事件驱动、Condition)

    2023-08-23 01:46:31
  • 关于C#10 新特性 Lambda 优化

    2022-05-31 08:21:16
  • SpringBoot中的响应式web应用详解

    2022-05-01 05:47:49
  • commons fileupload实现文件上传的实例代码

    2021-08-22 16:53:00
  • asp之家 软件编程 m.aspxhome.com