c#?使用線程對串口serialPort進行收發(fā)數(shù)據(jù)(四種)
更新時間:2022年07月22日 10:48:28 作者:雪墩墩
本文主要介紹了c#?使用線程對串口serialPort進行收發(fā)數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
本文主要介紹了c# 使用線程對串口serialPort進行收發(fā)數(shù)據(jù),分享給大家,具體如下:

一共寫了四種方法,窗體界面都是一樣的:
方法一:
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>
/// 發(fā)送數(shù)據(jù)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{
MessageBox.Show("請輸入要發(fā)送的數(shù)據(jù)");
}
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>
/// 接收數(shù)據(jù)
/// </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("請輸入要發(fā)送的數(shù)據(jù)");
}
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("請輸入要發(fā)送的數(shù)據(jù)");
}
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;
}
//創(chuàng)建線程
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("請輸入要發(fā)送的數(shù)據(jù)");
}
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();
}
}
}
// 建立委托 (參考網(wǎng)上 很規(guī)范的寫法)
方法三:
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>
/// 發(fā)送數(shù)據(jù)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{
MessageBox.Show("請輸入要發(fā)送的數(shù)據(jù)");
}
else
{
serialPort1.WriteLine(textBox2.Text);
}
}
/// <summary>
/// 接收數(shù)據(jù)
/// </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;
}
//創(chuàng)建線程
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("請輸入要發(fā)送的數(shù)據(jù)");
}
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>
/// 發(fā)送數(shù)據(jù)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{
MessageBox.Show("請輸入要發(fā)送的數(shù)據(jù)");
}
else
{
serialPort1.WriteLine(textBox2.Text);
}
}
/// <summary>
/// 接收數(shù)據(jù)
/// </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;
}
//創(chuàng)建線程
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("請輸入要發(fā)送的數(shù)據(jù)");
}
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進行收發(fā)數(shù)據(jù)(四種)的文章就介紹到這了,更多相關c# 串口serialPort收發(fā)數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

