<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文主要介紹了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收發資料內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45