C# 串口类封装(仪器控制)

前言

工控领域通常需要使用串口对仪器进行程控

目前主流的控制方式为:USB、串口、LAN

本篇文章主要介绍串口控制

需求分析

封装前需要分析串口类需要的方法进行分析和统计

1、通常情况下一台测试设备中可能包含多个串口仪器,所以串口类不能使用静态方法,那么就需要有构造方法。

2、串口的使用需要传递通讯参数,包括:波特率、数据位、校验位、停止位。而且串口还需要有Open的操作。所有串口类需要有串口的打开方法或这初始化方法。对应的也需要有Close方法。

3、上位机控制仪器,一般包含控制指令和询问指令。以万用表为例,控制指令:将万用表设置为电压档;询问指令:查询当的测量电压。所以串口类需要有Write方法和Query方法

代码实现

csharp 复制代码
public class PortHelper
{	
    public Action actConnectAfterDisConnect;
    public Action actDisConnectAfterConnect;
    public string portName;
    public int baudRate;
    public int dataBits;
    public StopBits stopBit;
    public Parity parity;
    private SerialPort port;
    public PortHelper(string portName, int baudRate, int dataBits, StopBits stopBit, Parity parity)
    {
        this.portName = portName;
        this.baudRate = baudRate;
        this.dataBits = dataBits;
        this.stopBit = stopBit;
        this.parity = parity;
    }
    /// <summary>
    /// 创建串口并连接
    /// </summary>
    /// <returns></returns>
    private bool Open()
    {
        port = new SerialPort(portName, baudRate, parity, dataBits, stopBit)
        {
            //设置读取超时时间
            ReadTimeout = 1500
        };
        try
        {
            port.Open();
        }
        catch (Exception)
        {
        }
        return port.IsOpen;
    }
    /// <summary>
    /// 关闭客户端
    /// </summary>
    public void Close()
    {
        port?.Close();
    }
    public bool Write(string order)
    {
        if (port == null || !port.IsOpen)
        {
            if (!Open())
                return false;
            actConnectAfterDisConnect?.Invoke();
        }
        try
        {
            port.WriteLine(order);
            return true;
        }
        catch (Exception)
        {
            actDisConnectAfterConnect?.Invoke();
            //需要记录下异常错误信息:e.Message
            return false;
        }
    }
    /// <summary>
    /// 客户端询问
    /// </summary>
    /// <param name="order"></param>
    /// <returns></returns>
    public string Query(string order)
    {
        if (port == null || !port.IsOpen)
        {
            if (!Open())
                return "ERR";
            actConnectAfterDisConnect?.Invoke();
        }
        try
        {
            port.WriteLine(order);
        }
        catch (Exception)
        {
            actDisConnectAfterConnect?.Invoke();
            return "ERR";
        }
        string rst = "";
        try
        {
            rst = port.ReadLine();
        }
        catch (Exception)
        {
            actDisConnectAfterConnect?.Invoke();
            return "ERR";
        }
        if (rst.Length == 0)
            return "ERR";
        return rst;
    }
    /// <summary>
    /// 异步询问
    /// </summary>
    /// <param name="order"></param>
    /// <returns></returns>
    public async Task<string> QueryAsync(string order, CancellationToken? ct = null)
    {
        CancellationToken token = ct ?? CancellationToken.None;
        if (port == null || !port.IsOpen)
        {
            if (!Open())
                return "ERR";
            actConnectAfterDisConnect?.Invoke();
        }
        try
        {
            port.WriteLine(order);
        }
        catch (Exception)
        {
            actDisConnectAfterConnect?.Invoke();
            return "ERR";
        }
        string rst;
        try
        {
            rst = await Task.Run(() => port.ReadLine()) ;
        }
        catch (Exception)
        {
            actDisConnectAfterConnect?.Invoke();
            return "ERR";
        }
        if (rst.Length == 0)
            return "ERR";
        return rst;
    }
}

其中actConnectAfterDisConnect 和 actDisConnectAfterConnect 表示断线重连和连接后异常断开的事件。

相关推荐
.NET修仙日记3 小时前
2026 .NET 面试八股文:高频题 + 答案 + 原理(高级核心篇)
面试·职场和发展·c#·.net·.net core·.net 8
唐青枫5 小时前
终于不用手搓两级缓存了!C#.NET HybridCache 详解:L1 L2、标签失效与防击穿实战
c#·.net
hixiong12318 小时前
C# OpenvinoSharp使用DINOv2模型进行图像相似度计算
开发语言·c#
月昤昽20 小时前
autoCAD二次开发 4.正多边形与collection区分
算法·c#·二次开发·autocad二次开发
Victory_202520 小时前
c#定时器顺序控制写法
开发语言·c#·c#顺序控制+定时器
雪度娃娃1 天前
基于TCP的网络词典
网络·c++·tcp/ip·c#
xxjj998a1 天前
PHP vs C#:两大编程语言终极对比
开发语言·c#·php
工程师0071 天前
C# 泛型:约束、协变逆变、底层模板生成机制
c#·泛型·逆变·协变
bestcxx1 天前
多个维度对 Java、Python、C#、Go 这四种主流编程语言进行比较
java·python·c#
我是唐青枫1 天前
内存为什么越来越高?C#.NET GC 详解:分代回收、LOH、终结器与性能优化实战
性能优化·c#·.net