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进行收发数据相关推荐

  1. STM32f407与STM32F103 串口采用DMA收发数据配置方法的异同

    最近有个项目需要用到STM32F407ZET6这款芯片,其中有一个串口收发数据的应用.因为之前有用过STMF32F103ZET6通过DMA收发数据的方案,所以我打算移植之前的代码实现这个功能,STM3 ...

  2. python串口操作_Python Serial串口基本操作(收发数据)

    1.需要模块以及测试工具 模块名:pyserial 使用命令下载:python -m pip install pyserial 串口调试工具:sscom5.13.1.exe 2.导入模块 import ...

  3. STM8S UART串口使用中断收发数据

    STM8S UART串口使用中断收发数据 原来调过STM8L的串口,逻辑简单,中断清晰,换成STM8S105K4后,虽然也是用STD库, 除去函数名.宏名等语言层面的差异以外,中断处理方面也有些不一样 ...

  4. STM32学习之串口采用DMA收发数据:需要利用状态机加DMA加串口

    写在前面 在学习这一节知识点的时候,真的是感觉太抽象了,没有一个合适的视频讲的我有那种豁然开朗的感觉,直到我看到了这篇文章,大家可以去看看,里面的描述特别形象. 链接:https://blog.csd ...

  5. Android MCU之间的串口通信(收发数据)

    最近一个项目是android和MCU之间的串口指令数据通信,捣鼓了很久,也找了很多网上的资料.最后将实现的总结记录下来. 使用的是GitHub中的一个项目,下载地址:https://github.co ...

  6. C#串口通信工作笔记0001---上位机开发_嵌入式_串口助手_收发数据开发

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 先看看这个串口通信助手的界面 可以选择波特率什么的

  7. pythonserial函数_Python Serial串口基本操作(收发数据)

    1.需要模块以及测试工具 模块名:pyserial 使用命令下载:python -m pip install pyserial 串口调试工具:sscom5.13.1.exe 2.导入模块 import ...

  8. Android开发板串口(SerialPort)通信

    Android开发板串口(SerialPort)通信 Roy88关注 22017.09.07 18:01:22字数 1,618阅读 28,511 前言: 最近在总是看见有人在群里面问一些串口通信相关的 ...

  9. C#串口SerialPort常用属性方法

    SerialPort(): //属性 .BaudRate;获取或设置波特率 .BytesToRead;得到 接收到数据的字节数 .BytesToWrites;得到送往串口的字节数 .DataBits; ...

最新文章

  1. [专题总结]AC自动机
  2. mockito_Mockito 101
  3. [gic]-ARM gicv3/gicv4的详细介绍-2020/08
  4. maven里如何根据不同的environment打包
  5. UVA12633 Super Rooks on Chessboard
  6. Oracle表重命名后索引、约束、权限、同义词的影响
  7. linux下执行efi文件,在Linux下创建EFI BIOS Grub加载分区
  8. 黄杏元《地理信息系统概论》考研复习考点精讲(八)
  9. 计算机制图总结,计算机制图总结.doc
  10. python程序设计基础教程ppt_Python程序设计基础教程
  11. IPETRONIK为您提供专业化的数据采集软件IPEmotion进行声学采集与分析
  12. 无刷直流电机控制-->霍尔传感器
  13. 亮剑精神---程序人生路
  14. 六成受访美国人认为教育系统正在令这一代人失望
  15. 玩法专利获批,发布4年《Beat Saber》为何持续火爆
  16. 数据预处理之中心化(零均值化)与标准化(归一化)
  17. Exception————c3p0
  18. MyEclipse更换主题皮肤
  19. sql语句实现多条数据合为一条数据
  20. 面试官让我滚,我用了20分钟,狠狠装了一回逼!

热门文章

  1. 打印的增值税电子专用发票没有加盖发票专用章能不能入账?
  2. 关于NetKeeper(创翼)升级后,无法共享WIFI问题的解决-猎豹、360都可
  3. mcp2515 linux 设备树,mcp2515驱动的实现
  4. Numpy简易教程8——简易分析
  5. Linux轻桌面将席卷全球
  6. 北京中信银行总行地址_【中信银行总行】中信银行总行电话,中信银行总行地址_图吧地图...
  7. matlab的GUI设计
  8. 不用找,你想要的车样机图片素材都在这里
  9. 解决DatePickerDialog和TimePickerDialog控件取消按钮问题
  10. 上海交大ACM总教头俞勇讲述“最聪明人的故事”