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收发数据内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!
相关内容
-
硬盘库存迫切需要通过西方数据,三星已经停止向零
硬盘库存迫切需要通过西方数据,三星已经停止向零售商发送硬盘...
-
无法读取U盘中的数据
无法读取U盘中的数据,,核心提示:我有一个512MB的U盘,把它插在电...
-
wps数据拟合图形公式|你好,请问在WPS中拟合线性
wps数据拟合图形公式|你好,请问在WPS中拟合线性方程,请问在WP...
-
四PK四线程核心英特尔核心与AMD速龙
四PK四线程核心英特尔核心与AMD速龙,,英特尔32纳米Clarkdale处...
-
计算机不能打开网页发送更多的数据包,但很少收到
计算机不能打开网页发送更多的数据包,但很少收到(解决方案)。,,问...
-
wps删除重复数据|WPS表格中,删除重复项,只保留
wps删除重复数据|WPS表格中,删除重复项,只保留一个数据,如何...
-
如何使用selenium+TestNG做web数据驱动测试
如何使用selenium+TestNG做web数据驱动测试,数据库,数据,本文...
-
wps表格查找重复的数据|在wps表格中查找重复数
wps表格查找重复的数据|在wps表格中查找重复数据,表格,重复,...
-
EXCEL数据透视表怎么用?是干什么的
EXCEL数据透视表怎么用?是干什么的,透视,干什么,怎么,excel透视...
-
完成端口与线程池的问题?可以多个iocp完成端口共
完成端口与线程池的问题?可以多个iocp完成端口共用吗,端口,线...
-
电脑数据的销毁手段|电脑怎么销毁数据
电脑数据的销毁手段|电脑怎么销毁数据,,电脑怎么销毁数据用软...
-
通过备份记录获得数据库的增长
通过备份记录获得数据库的增长,,通常你想知道数据库是否正在增...
-
金蝶损益类科目如何录入初始数据|金蝶软件怎样
金蝶损益类科目如何录入初始数据|金蝶软件怎样录入科目初始...
-
硬盘插电脑没反应|硬盘插电脑没反应,数据怎么导
硬盘插电脑没反应|硬盘插电脑没反应,数据怎么导出,,1. 硬盘插...
-
C# 控件BackColor = Color.Transparent没有透明
C# 控件BackColor = Color.Transparent没有透明的原因,窗体,...