一、前言
串口是串行接口(Serial Port) 的简称,是一种常用于电子设备间通讯的全双工扩展接口。常见的有RS-232标准一般应用在计算机与外部设备之间进行数据传输(有25针或9针连接器)。我们现在的计算机基本上已经看不到串口,我们可以通过USB适配器来将COM端口转换为USB接口进行连接。今天我们来了解.NET 如何用C#语言编写代码实现与这些设备进行通信。
二、串口通信
串口通信包括通信时序、通讯速率、数据传输。
常用的通讯速率有2400bps、4800bps、9600bps、19200bps、38400bps、115200bps。
我们通过下图对串口的通信时序进行简单了解,串口时序由起始位、数据位、校验位、停止位组成。
下表对时序组成进行说明
名称 | 描述 |
---|---|
起始位 | 占用1位,低电平有效。 |
数据位 | 可以是5位、6位、7位、8位,其中最常用为8位。 |
校验位 | 占用1位,无校验位时不占用。 |
偶校验(even parity):校验原则是,数据位和校验位中1的个数为偶数 | |
奇校验(odd parity):校验原则是,数据位和校验位中1的个数为奇数 | |
无校验(odd parity):即时序图中没有校验位 | |
(Space):校验位总为0 | |
(Mark):校验位总为1 | |
停止位 | 占用1位、1.5位、2位,高电平有效 |
三、SerialPort类
.NET的框架类库提供了SerialPort类,可用SerialPort类来配置和管理串口的属性,可用于发送和接收数据。SerialPort类的常用属性包括PortName、BaudRate、Parity、DataBits、StopBits、Handshake、ReadTimeout和WriteTimeout等。这些属性用于指定串口的名称、波特率、校验位、数据位、停止位、握手协议以及读取和写入数据时的超时时间等。
-
属性
红色是类常用的属性,在我们使用类时根据连接设备情况进行属性的配置。
-
方法
我们先配置类的属性,然后使用 Open() 方法打开串口,使用 Write() 方法发送数据,使用 Read() 方法读取数据,并使用 Close() 方法关闭串口。
-
事件
在发送和接收数据时,我们也可以使用事件来处理数据的到达和发送完成。
四、示例
我们先定义波特率与数据位二个枚举类型:
/// <summary>
/// 波特率
/// </summary>
[Serializable]
public enum BaudRates
{
Baud1200 = 1200,
Baud2400 = 2400,
Baud4800 = 4800,
Baud9600 = 9600,
Baud14400 = 14400,
Baud19200 = 19200,
Baud38400 = 38400,
Baud115200 = 115200
}
/// <summary>
/// 数据位
/// </summary>
[Serializable]
public enum DataBits
{
/// <summary>
/// 5位
/// </summary>
Bit5=5,
/// <summary>
/// 6位
/// </summary>
Bit6 = 6,
/// <summary>
/// 7位
/// </summary>
Bit7 = 7,
/// <summary>
/// 8位
/// </summary>
Bit8 = 8
}
我这将对串口的操作封装在一个类上。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
namespace Fountain.Net.Core.Com
{
/// <summary>
/// 串空操作
/// </summary>
public class OperationSerialPort
{
/// <summary>
/// 数据接收
/// </summary>
public event Action<List<string>>? DataReceived;
/// <summary>
/// 接收异常
/// </summary>
public event SerialEr