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


猜你喜欢
- 本文实例讲述了Java中计算时间差的方法。分享给大家供大家参考。具体如下:假设现在是2004-03-26 13:31:40过去是:2004-
- 随着对多线程学习的深入,你可能觉得需要了解一些有关线程共享资源的问题. .NET framework提供了很多的类和数据
- 一、return语句执行顺序finally语句是在return语句执行之后,return语句返回之前执行的package exception
- 每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联。Handler一般有两种用途:1)执行计划任务,
- <foreach>标签动态增删改查mybatis<foreach>有的时候在项目中需要查询某个列表时,可能会在代码中
- 前言最近遇到很有意思转换二进制的问题,有部分童鞋俨然已了解,可能也有一部分童鞋没碰到过也就不知情,这里我们来深入学习下转换二进制所带来的问题
- 本文实例讲述了Android使用ActionBar和ViewPager切换页面,分享给大家供大家参考。具体如下:运行效果截图如下:项目布局如
- Java Json的各种处理一、net.sf.json1、Json转MapJSONObject jsonObject = JSONObjec
- 将Excel转为PDF格式时,通常情况下转换出来的PDF页面都是默认的宽度大小;如果Excel表格数据的设计或布局比较宽或者数据内较少的情况
- Mybatis selectKey返回新增用户的id值一、需求:新增用户后,同时还要返回当前新增用户的id值id是由数据库的自动增长来实现的
- 一:简介方法引用分为三种,方法引用通过一对双冒号:: 来表示,方法引用是一种函数式接口的另一种书写方式静态方法引用,通过类名::静态方法名,
- 一、图形DrawableDrawable类型表达了各种各样的图形,包括图片、色块、画板、背景等。包含图片在内的图形文件放在res目录的各个d
- 容器类、正则表达式在几乎所有编程语言都存在的东西。很常用也很使用。下面用如下的一个控制台小程序说明C#的正则表达式与容器类的应用。开始直接输
- Elasticsearch 在全文搜索里面基本是无敌的,在大数据里面也很有建树,完全可以当nosql(本来也是nosql)使用。这篇文章简单
- final关键字的作用final关键字可以用来修饰引用、方法和类。1.final关键字修饰类当用final关键字修饰一个类后,这个类不能被继
- 这篇文章主要介绍了JAVA基于SnakeYAML实现解析与序列化YAML,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 本文实例讲述了Android7.0开发实现Launcher3去掉应用抽屉的方法。分享给大家供大家参考,具体如下:年初做过一个项目,有一个需求
- 坑出现的环境一般情况下切割字符串会使用split或者StringTokenizer,如下代码String s = ",,o,,&q
- 本文实例为大家分享了C# picturebox实现图像拖拽和缩放的具体代码,供大家参考,具体内容如下1.核心步骤:①新建Point类型全局变
- 1.注解声明:通过@interface就可以声明一个注解。@Target(ElementType.FIELD)@Retention(Rete