C#串口编程入门:简单多线程应用

4星 · 超过85%的资源 需积分: 12 75 下载量 196 浏览量 更新于2024-11-25 1 收藏 5KB TXT 举报
"C#串口编程基础教程,包含简单多线程应用,适用于初学者学习" 在本文中,我们将深入探讨C#中的串口通信编程,这是一个基础教程,特别适合那些刚开始接触该领域的初学者。串口通信是设备之间进行数据交换的一种常见方式,它在嵌入式系统、工业自动化、物联网(IoT)等领域有着广泛的应用。 C#提供了`System.IO.Ports`命名空间,其中包含了`SerialPort`类,这个类为我们提供了与物理串行端口进行交互的方法和属性。下面我们将详细讲解如何使用`SerialPort`类以及如何实现简单的多线程来提高程序的效率。 首先,我们创建一个名为`PortChat`的类,并定义了两个静态变量:`_continue`用于控制程序的运行状态,以及`_serialPort`用来实例化`SerialPort`对象。在`Main`方法中,我们初始化了这些变量,并创建了一个新的线程`readThread`,用于处理串口的读取操作。 接下来,我们设置`SerialPort`对象的各个参数,如端口号(`PortName`)、波特率(`BaudRate`)、奇偶校验(`Parity`)、数据位(`DataBits`)、停止位(`StopBits`)和握手协议(`Handshake`)。这些都是串口通信的关键设置,根据实际连接的硬件设备和通信需求进行调整。同时,我们还设置了读写超时值(`ReadTimeout`和`WriteTimeout`),以避免程序因等待响应而阻塞。 然后,我们打开串口(`_serialPort.Open()`),开始读取线程(`readThread.Start()`),并进入一个循环,在循环中用户可以输入消息。当用户输入“QUIT”时,程序将退出。这展示了如何在控制台应用程序中与用户进行交互,并通过串口发送和接收数据。 简单多线程的运用在于,我们创建了一个独立的线程`readThread`来处理串口的读取工作,这样主线程可以继续执行其他任务,比如接收用户输入,而不必等待串口读取完成。这是一种常见的提高程序响应性和效率的技术。 这个C#串口编程教程介绍了如何使用`System.IO.Ports.SerialPort`类进行基本的串口通信,以及如何利用多线程进行并发操作。对于初学者来说,理解这些概念和技术对于开发涉及串口通信的项目至关重要。通过实践这个教程,你可以掌握如何在C#环境中设置串口参数、打开关闭串口、发送接收数据以及实现多线程通信,从而能够更好地应对实际开发中的挑战。
2015-04-19 上传
namespace 串口实例 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnSend_Click(object sender, EventArgs e) { //手动发送 SendMsg(); } private void SendMsg() { this.serialPort1.Write(this.txtSend.Text); } #region 控制输入数字 private void ComboBox_TextUpdate(object sender, EventArgs e) { ComboBox cbo = sender as ComboBox; int n; if (!int.TryParse(cbo.Text, out n)) { cbo.Text = cbo.Text.Substring(0, cbo.Text.Length - 1); } else { if (n <= 0) { cbo.Text = cbo.Text.Substring(0, cbo.Text.Length - 1); } } } private void txtTime_TextChanged(object sender, EventArgs e) { TextBox text = sender as TextBox; int n; if (!int.TryParse(text.Text, out n)) { text.Text = text.Text.Substring(0, text.Text.Length - 1); } else { if (n <= 0) { text.Text = text.Text.Substring(0, text.Text.Length - 1); } else { this.timer1.Interval = n; } } } #endregion /// /// 清空显示文本框 /// /// <param name="sender"></param> /// <param name="e"></param> private void btnClear_Click(object sender, EventArgs e) { this.txtRecive.Clear(); } private void timer1_Tick(object sender, EventArgs e) { SendMsg(); } private void cbtSend_CheckedChanged(object sender, EventArgs e) { CheckBox check = sender as CheckBox; if (check.Checked) { this.timer1.Start(); } else { this.timer1.Stop(); } } /// /// 接收返回的数据 /// /// <param name="sender"></param> /// <param name="e"></param> private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string a=""; if (this.cbkShow16.Checked) { //十六进制显示 a = this.serialPort1.ReadExisting(); } else { //字符串显示 byte[] by = new byte[this.serialPort1.BytesToRead]; this.serialPort1.Read(by, 0, this.serialPort1.BytesToRead); a = Encoding.ASCII.GetString(by); } this.txtRecive.AppendText(a); this.txtRecive.ScrollToCaret(); } private void Form1_Load(object sender, EventArgs e) { //加载 this.serialPort1.RtsEnable = true; button1_Click(this.btnOpen, null); } private void button1_Click(object sender, EventArgs e) { Button btn = sender as Button; if (btn.Text == "打开端口") { try { this.serialPort1.PortName = this.cboPortName.Text; this.serialPort1.BaudRate = Convert.ToInt32(this.cboRaudRate.Text); this.serialPort1.DataBits = Convert.ToInt32(this.cboDataBits.Text); this.serialPort1.ReceivedBytesThreshold = Convert.ToInt32(this.cboReceivedBytesThreshold.Text); this.serialPort1.Open(); btn.Text = "关闭端口"; } catch { MessageBox.Show("打开端口失败,请检查端口是否被占用."); } } else { this.serialPort1.Close(); btn.Text = "打开端口"; } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { try { this.serialPort1.Close(); } catch { } } } }