C#上位机系列教程零基础入门-串口操作
欢迎来到C#上位机教程的零基础入门!本教程将帮助你从零开始学习C#编程,并使用C#构建上位机应用程序,本教程将以经典的串口工具开发为Demo,讲述一个项目如何去实现,本节内容将讲述串口的操作。
首先简单介绍下串口通讯中一个重要的类库SerialPort,SerialPort 类是用于在计算机上通过串行端口与外部设备进行通信的类。串行端口是一种用于在计算机和外部设备之间传输数据的物理接口,例如用于连接调制解调器、打印机、传感器等设备。在 .NET Framework 和 .NET Core(现在称为 .NET 5+)等平台中,System.IO.Ports.SerialPort 类提供了与串行端口进行通信的功能。通过此类,您可以打开、关闭串行端口,发送和接收数据,配置通信参数等。以下是 SerialPort 类的一些重要方法和属性:
构造函数:
SerialPort(string portName): 通过指定的串行端口名称创建一个 SerialPort 实例。
重要属性:
PortName: 获取或设置要使用的串行端口的名称。
BaudRate: 获取或设置波特率(数据传输速率)。
DataBits: 获取或设置数据位数。
Parity: 获取或设置奇偶校验位。
StopBits: 获取或设置停止位的数量。
ReadTimeout 和 WriteTimeout: 获取或设置读取和写入操作的超时时间。
方法:
Open(): 打开串行端口以进行通信。
Close(): 关闭串行端口。
Write(byte[] buffer, int offset, int count): 将指定数量的字节写入串行端口。
Read(byte[] buffer, int offset, int count): 从串行端口读取指定数量的字节。
DataReceived 事件:当接收到数据时触发的事件。
使用 SerialPort 类,您可以创建串行端口通信的应用程序,如与硬件设备通信、数据采集、传感器数据读取等。需要注意的是,在使用此类时,要小心处理异常情况,如端口不可用、数据传输错误等。
我们紧接上一节的教程,在Form窗体中通过拖放的方式加载SerialPort组件如下图所示
注意,在.Net6中serialPort类库需要通过NuGet的方式引入。
双击Form查看代码,使用“using”引入“System.IO.Ports”这个命名空间
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports; //引入命名空间
using System.Text;
using System.Windows.Forms;
System.IO.Ports包含用于控制串行端口的类。最重要的类 SerialPort 为同步和事件驱动 I/O 提供框架,提供对插针和中断状态的访问,以及对串行驱动程序属性的访问。它可用于包装 Stream 对象,允许使用流的类访问串行端口。
双击"打开串口"系统自动根据button按钮的"Name"属性生成一个产生双击"打开串口"的事件后调用的方法,完整代码如下:
private void OpenPortBtn_Click(object sender, EventArgs e)
{
try
{
if (!portOpenFlag)
{
//串口号
serialPort1.PortName = portCbb.Text;
// 波特率
serialPort1.BaudRate = Convert.ToInt32(baudCbb.Text);
//检验位 从枚举中获取相应的值 FaceType aaa = (FaceType)Enum.Parse(typeof(FaceType), cbFace.Text)
serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity),checkCbb .Text);
//数据位
serialPort1.DataBits = Convert.ToInt32(dataBitsCbb.Text);
//停止位
serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits),stopBitsCbb.Text);
serialPort1.Open();
portOpenFlag = true;
this.OpenPortBtn.Text = "关闭串口";
}
else
{
portOpenFlag = false;
serialPort1.Close();
this.OpenPortBtn.Text = "打开串口";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message+serialPort1.PortName.ToString());
}
}
代码解析:先建立一个bool类型的串口打开状态标志位初始状态为false:portOpenFlag,如果串口没有打开。我们初始化配置参数,主要包括端口号,波特率,数据位,停止位,校验位,并且调用串口打开函数,将portOpenFlag置位为true,按钮文本改为'关闭串口',如果串口已经打开。 portOpenFlag 置位为 false;并且调用串口关闭函数,将portOpenFlag置位为true,按钮文本改为'打开串口',在串口打开或者关闭的过程中有很多因素导致操作失败,所以我们用try`````catch捕捉异常,及时将错误抛出,避免程序的奔溃
在代码调试的过程中,我们需要用虚拟串口工具百度网盘链接如下:链接:https://pan.baidu.com/s/1S0XXsXIXE-hQQd9AoCgnFA?pwd=m42i 提取码:m42i
安装好虚拟串口工具以后,我们添加两个虚拟串口COM2和COM3
同时我们在电脑的设备管理器也能看到COM2和COM3.
下面通过代码获取到设备管理器中的COM2和COM3,并且将串口通讯参数的值设置为我们想要的默认值
首先绑定波特率,数据位,停止位,校验位,的数据集合
具体操作如下图:
波特率
检验位
数据位
停止位
新建一个SerialPortInit方法,专门用于通讯参数combox的text值的初始化
private void SerialPortInit()
{
//获取设备管理器的串口号
string[] ports = SerialPort.GetPortNames();
//将ports数组绑定奥串口号comobox 的数据源上
this.portCbb.DataSource = ports;
this.portCbb.SelectedIndex = 0;
//波特率
this.baudCbb.SelectedIndex = 3;
//校验位
this.checkCbb.SelectedIndex = 0;
//数据位
this.dataBitsCbb.SelectedIndex = 0;
//停止位
this.stopBitsCbb.SelectedIndex = 1;
}
然后再窗体初始化时调用此函数
private void Form1_Load(object sender, EventArgs e)
{
this.SerialPortInit();
}
最终通讯参数默认值如下:
当我们选择打开“COM2”时,虚拟串口COM2显示的通讯参数能够和串口工具的通讯设定值对应上。