C# USB类封装(仪器控制)

前言

工控领域通常需要使用串口对仪器进行程控
目前主流的控制方式为:USB、串口、LAN
本篇文章主要介绍USB控制

需求分析

封装前需要分析串口类需要的方法进行分析和统计
1、通常情况下一台测试设备中可能包含多个USB仪器,所以USB类不能使用静态方法,那么就需要有构造方法。
2、上位机与USB设备的连接需要使用资源号。可以通过NI.Max软件来获取仪器的资源号,也可以通过代码获取当前设备中的所有USB设备的连资源号。(该方法需要为静态方法)
3、上位机控制仪器,一般包含控制指令和询问指令。以万用表为例,控制指令:将万用表设置为电压档;询问指令:查询当的测量电压。所以USB类需要有Write方法和Query方法

代码实现

public class UsbHelper
{
    public Action actConnectAfterDisConnect;
    public Action actDisConnectAfterConnect;
    private readonly static ResourceManager rm = new ResourceManager();
    /// <summary>
    /// 获取所有USB设备资源号
    /// </summary>
    /// <returns></returns>
    public static List<string> GetAllResourceName()
    {
        List<string> result = new List<string>();
        IEnumerable<string> allInstr;
        try
        {
            allInstr = rm.FindRsrc("USB?*");
        }
        catch (Exception)
        {
            return result;
        }
        foreach (var item in allInstr)
        {
            result.Add(item);
        }
        return result;
    }

    public UsbHelper(string resourceName)
    {
        this.resourceName = resourceName;
    }
    /// <summary>
    /// USB设备对象
    /// </summary>
    private readonly FormattedIO488 objSession = new FormattedIO488();
    /// <summary>
    /// 设备资源名
    /// </summary>
    private readonly string resourceName;
    /// <summary>
    /// 建立链接
    /// </summary>
    /// <returns></returns>
    private bool Connect()
    {
        if (objSession.IO == null)
        {
            try
            {
                objSession.IO = (IMessage)rm.Open(resourceName);
                objSession.IO.Timeout = 100;
                return true;
            }
            catch (Exception e)
            {
                string estr = e.Message;
                DisConnect();
                return false;
            }
        }
        return true;
    }
    /// <summary>
    /// 断开链接
    /// </summary>
    public void DisConnect()
    {
        objSession.IO = null;
    }
    /// <summary>
    /// 写入
    /// </summary>
    /// <param name="order">指令</param>
    /// <returns></returns>
    public bool Write(string order)
    {
        if (!Connect())
            return false;
        actConnectAfterDisConnect?.Invoke();
        try
        {
            objSession.IO.WriteString(order);
            return true;
        }
        catch (Exception)
        {
            actDisConnectAfterConnect?.Invoke();
            DisConnect();
            return false;
        }
    }
    /// <summary>
    /// 询问
    /// </summary>
    /// <param name="order">指令</param>
    /// <returns></returns>
    public string Query(string order)
    {
        if (!Connect())
            return "ERR";
        actConnectAfterDisConnect?.Invoke();
        try
        {
            objSession.IO.WriteString(order);
            return objSession.ReadString().Trim();
        }
        catch (Exception)
        {
            actDisConnectAfterConnect?.Invoke();
            DisConnect();
            return "ERR";
        }
    }
    /// <summary>
    /// 异步询问
    /// </summary>
    /// <param name="order">指令</param>
    /// <returns></returns>
    public async Task<string> QueryAsync(string order)
    {
        if (!Connect())
            return "ERR";
        actConnectAfterDisConnect?.Invoke();
        return await Task.Run(() =>
        {
            try
            {
                objSession.IO.WriteString(order);
                return objSession.ReadString().Trim();
            }
            catch (Exception)
            {
                actDisConnectAfterConnect?.Invoke();
                DisConnect();
                return "ERR";
            }
        });
    }
}

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

使用USB控制仪器还需要安装Visa软件。
代码中对应的Visa版本是Visa530

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值