前言
工控领域通常需要使用串口对仪器进行程控
目前主流的控制方式为: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