c# 使用线程对串口serialPort进行收发数据(四种)
短信预约 -IT技能 免费直播动态提醒
本文主要介绍了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收发数据内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341