c#?使用線(xiàn)程對(duì)串口serialPort進(jìn)行收發(fā)數(shù)據(jù)(四種)
本文主要介紹了c# 使用線(xiàn)程對(duì)串口serialPort進(jìn)行收發(fā)數(shù)據(jù),分享給大家,具體如下:
一共寫(xiě)了四種方法,窗體界面都是一樣的:
方法一:
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(); //不進(jìn)行跨線(xiàn)程安全檢查 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); //標(biāo)序號(hào) for (int i = 0; i < 69; i++) { dataGridView1.Rows[i].Cells[0].Value = i; } } /// <summary> /// 打開(kāi)串口 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { MessageBox.Show("串口已打開(kāi)"); } else if (comboBox1.Text == "") { MessageBox.Show("請(qǐng)選擇端口!"); } else if (textBox1.Text == "") { MessageBox.Show("請(qǐng)輸入波特率!"); } 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("請(qǐng)輸入要發(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> /// 關(guān)閉串口 /// </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> /// 開(kāi)始 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button5_Click(object sender, EventArgs e) { if (false == serialPort1.IsOpen) { MessageBox.Show("端口未打開(kāi)"); } else { thread = new Thread(new ThreadStart(PrintEven)); thread.Start(); } } private void PrintEven() { while (true) { if (textBox2.Text == "") { MessageBox.Show("請(qǐng)輸入要發(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> /// 結(jié)束 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button6_Click(object sender, EventArgs e) { thread.Abort(); } } } //不進(jìn)行跨線(xiàn)程安全檢查
方法二:
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); //標(biāo)序號(hào) for (int i = 0; i < 69; i++) { dataGridView1.Rows[i].Cells[0].Value = i; } } /// <summary> /// 打開(kāi)串口 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { MessageBox.Show("串口已打開(kāi)"); } else if (comboBox1.Text == "") { MessageBox.Show("請(qǐng)選擇端口!"); } else if (textBox1.Text == "") { MessageBox.Show("請(qǐng)輸入波特率!"); } 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("請(qǐng)輸入要發(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)建線(xiàn)程 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("端口未打開(kāi)"); } else { thread = new Thread(new ThreadStart(PrintEven)); thread.Start(); } } private void PrintEven() { while (true) { if (textBox2.Text == "") { MessageBox.Show("請(qǐng)輸入要發(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> /// 結(jié)束 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button6_Click(object sender, EventArgs e) { thread.Abort(); } } } // 建立委托 (參考網(wǎng)上 很規(guī)范的寫(xiě)法)
方法三:
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); //標(biāo)序號(hào) for (int i = 0; i < 69; i++) { dataGridView1.Rows[i].Cells[0].Value = i; } } /// <summary> /// 打開(kāi)串口 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { MessageBox.Show("串口已打開(kāi)"); } else if (comboBox1.Text == "") { MessageBox.Show("請(qǐng)選擇端口!"); } else if (textBox1.Text == "") { MessageBox.Show("請(qǐng)輸入波特率!"); } 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> /// 關(guān)閉串口 /// </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("請(qǐng)輸入要發(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)建線(xiàn)程 Thread thread; /// <summary> /// 開(kāi)始 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button5_Click(object sender, EventArgs e) { if (false == serialPort1.IsOpen) { MessageBox.Show("端口未打開(kāi)"); } else { thread = new Thread(new ThreadStart(PrintEven)); thread.Start(); } } private void PrintEven() { while (true) { if (textBox2.Text == "") { MessageBox.Show("請(qǐng)輸入要發(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); //標(biāo)序號(hào) for (int i = 0; i < 69; i++) { dataGridView1.Rows[i].Cells[0].Value = i; } } /// <summary> /// 打開(kāi)串口 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { MessageBox.Show("串口已打開(kāi)"); } else if (comboBox1.Text == "") { MessageBox.Show("請(qǐng)選擇端口!"); } else if (textBox1.Text == "") { MessageBox.Show("請(qǐng)輸入波特率!"); } 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> /// 關(guān)閉串口 /// </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("請(qǐng)輸入要發(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)建線(xiàn)程 Thread thread; /// <summary> /// 開(kāi)始 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button5_Click(object sender, EventArgs e) { if (false == serialPort1.IsOpen) { MessageBox.Show("端口未打開(kāi)"); } else { thread = new Thread(new ThreadStart(PrintEven)); thread.Start(); } } private void PrintEven() { while (true) { if (textBox2.Text == "") { MessageBox.Show("請(qǐng)輸入要發(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> /// 結(jié)束 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button6_Click(object sender, EventArgs e) { thread.Abort(); } } } //建立委托,invoke的第二種寫(xiě)法
到此這篇關(guān)于c# 使用線(xiàn)程對(duì)串口serialPort進(jìn)行收發(fā)數(shù)據(jù)(四種)的文章就介紹到這了,更多相關(guān)c# 串口serialPort收發(fā)數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C#實(shí)現(xiàn)獲取本地磁盤(pán)目錄
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)獲取本地磁盤(pán)目錄的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12輕松學(xué)習(xí)C#的結(jié)構(gòu)和類(lèi)
輕松學(xué)習(xí)C#的結(jié)構(gòu)和類(lèi),對(duì)C#的結(jié)構(gòu)和類(lèi)感興趣的朋友可以參考本篇文章,幫助大家更靈活的運(yùn)用C#的結(jié)構(gòu)和類(lèi)2015-11-11c# 如何實(shí)現(xiàn)自動(dòng)更新程序
這篇文章主要介紹了如何用c# 自動(dòng)更新程序,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03C#中定時(shí)任務(wù)被阻塞問(wèn)題的解決方法
這篇文章主要給大家介紹了關(guān)于C#中定時(shí)任務(wù)被阻塞問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11C#使用GUID(全局統(tǒng)一標(biāo)識(shí)符)
這篇文章介紹了C#使用GUID(全局統(tǒng)一標(biāo)識(shí)符)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04C#難點(diǎn)逐個(gè)擊破(4):main函數(shù)
貌似我是在寫(xiě)C#的學(xué)習(xí)筆記哦,不過(guò)反正可以利用這個(gè)機(jī)會(huì)來(lái)好好溫習(xí)下基礎(chǔ)知識(shí),這其中很多知識(shí)點(diǎn)都屬于平時(shí)視而見(jiàn)的小知識(shí)2010-02-02