c# 使用线程对串口serialPort进行收发数据(四种)
作者:雪墩墩 时间:2023-06-20 13:05:48
本文主要介绍了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,收发数据
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
React Native与Android 原生通信的方法
2021-08-11 19:02:56
java Springboot实现教务管理系统
2023-01-18 00:28:12
![](https://img.aspxhome.com/file/2023/6/64906_0s.png)
Java编程实现统计一个字符串中各个字符出现次数的方法
2023-01-24 18:02:20
![](https://img.aspxhome.com/file/2023/3/84173_0s.jpg)
Android使用Retrofit上传文件功能
2022-08-28 08:42:38
简单了解JAVA public class与class区别
2023-11-15 23:59:26
![](https://img.aspxhome.com/file/2023/5/59675_0s.png)
SpringBoot实现PPT格式文件上传并在线预览功能
2023-07-22 14:44:56
![](https://img.aspxhome.com/file/2023/3/57403_0s.png)
Java8使用stream实现list中对象属性的合并(去重并求和)
2023-06-23 13:44:40
![](https://img.aspxhome.com/file/2023/9/62379_0s.png)
Spring计划任务用法实例详解
2021-08-03 11:41:08
在C#程序中对MessageBox进行定位的方法
2022-03-04 18:45:26
Android rom解包打包工具
2023-09-01 21:49:10
![](https://img.aspxhome.com/file/2023/5/139015_0s.jpg)
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
![](https://img.aspxhome.com/file/2023/5/137195_0s.png)
C#使用BackgroundWorker控件
2022-10-25 05:06:35
![](https://img.aspxhome.com/file/2023/0/129640_0s.jpg)
Android开发之WebView组件的使用解析
2022-07-22 21:52:15
基于SpringBoot核心原理(自动配置、事件驱动、Condition)
2023-08-23 01:46:31
![](https://img.aspxhome.com/file/2023/4/58424_0s.jpg)
关于C#10 新特性 Lambda 优化
2022-05-31 08:21:16
SpringBoot中的响应式web应用详解
2022-05-01 05:47:49
![](https://img.aspxhome.com/file/2023/3/132183_0s.png)
commons fileupload实现文件上传的实例代码
2021-08-22 16:53:00
![](https://img.aspxhome.com/file/2023/4/97794_0s.png)