这篇“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进行收发数据”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。