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收發數據內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!