C# 使用SCPI通过GPIB和RS-232/COM进行通信
我目前正在寻找通过C#与兼容设备进行通信的各种可能性。我已经通过COM接口在LabWindows/CVI(语言:C)中编写了我的第一个代码,并完全“手动”完成了它,正如我所说:C# 使用SCPI通过GPIB和RS-232/COM进行通信,c#,com,serial-port,gpib,C#,Com,Serial Port,Gpib,我目前正在寻找通过C#与兼容设备进行通信的各种可能性。我已经通过COM接口在LabWindows/CVI(语言:C)中编写了我的第一个代码,并完全“手动”完成了它,正如我所说: ComOpen(ComId, "Com1",....); ComWrite("SYST:...\r"); ComRead(&value)` 像这样的。问题是我不喜欢纯C语言,缺少面向对象编程是愚蠢的,因为我有真正的对象想要通信。亲爱的国家仪器,为什么不使用OOP来控制对象 现在有人给了我一个提示,我应该查看全局
ComOpen(ComId, "Com1",....);
ComWrite("SYST:...\r");
ComRead(&value)`
像这样的。问题是我不喜欢纯C语言,缺少面向对象编程是愚蠢的,因为我有真正的对象想要通信。亲爱的国家仪器,为什么不使用OOP来控制对象
现在有人给了我一个提示,我应该查看全局SCPI文档,因为其中的信息比设备手册中的要多。我发现了一组与.NET兼容的命令。比如说,
IIviDCPwr Ivi.DCPwr.Create(String resourceName,
Boolean idQuery,
Boolean reset,
LockType lockType,
String accessKey,
String options);
与SCPI设备建立面向对象的通信。因为我真的很喜欢C#我想在接下来的几周里试试这个
但我真的看不到连接设置,因为resourceName似乎只是一个用于在以后释放设备的名称,而其他设置是在连接已设置时使用的。IIviDCPwr实例如何知道应该使用哪个连接(TCP/IP、COM或GPIB)
我只见过使用套接字的TCP/IP解决方案。但我认为这不适用于COM和GPIB
另一个解决办法是使用国家仪器签证包。但我不喜欢使用NI提供的专有软件包(我认为在使用CVI后,我感觉到一种新的对NI的排斥)
您能否提供代码片段或文档来处理此问题?您是否有使用VISA的经验?我可以使用套接字进行COM/GPIB通信吗
顺便问一下:如何在代码段中创建新行?enter和Shift+enter都不适用于我…您可以使用.NET和(不使用VISA)通过读/写方法与设备通信。关于GPIB,您的硬件应该有一个.NET驱动程序,使用类似的方法
如何使用SerialPort(使用一些伪SCPI)与设备通信的示例
现在您可以创建设备类,其中每个实例都有自己的协议(SerialPort、Socket、GPIB)和方法
public class SomeDevice
{
private SerialPort _port;
public SomeDevice(string serialPortName)
{
// do the connection work...
}
public void SetVoltage(float voltage)
{
port.WriteLine(":VOLT " + voltage.ToSring("N2"));
}
public float GetVoltage()
{
port.WriteLine(":DEVICE:MEAS:VOLT?");
return float.Parse(port.ReadLine()); //reading from device
}
}
您甚至可以通过创建通用连接的接口(比如-GenConnection)(使用常见的读/写方法)来改进类,使其能够使用任何类型的连接(SerialPort、Socket、GPIB…),然后创建实现此接口的连接类型的子级-然后每个设备将只有GenConnection实例,而不“知道”它实际是哪种连接(只是为每种连接重载构造函数)
需要记住的几点:
- 编程手册有助于避免常见错误
- 连接配置(波特率、奇偶校验…)
- 行尾字符,您应该记住发送和分离读数
使用设备的行尾-通常是
或
(\r”或“\r\n”在C#中) SerialPort的
&读线
正在使用指定的SerialPort的写线
属性为您执行此操作换行
- 您可以使用来使用端口和套接字查看所有内容
public class SomeDevice
{
private SerialPort _port;
public SomeDevice(string serialPortName)
{
// do the connection work...
}
public void SetVoltage(float voltage)
{
port.WriteLine(":VOLT " + voltage.ToSring("N2"));
}
public float GetVoltage()
{
port.WriteLine(":DEVICE:MEAS:VOLT?");
return float.Parse(port.ReadLine()); //reading from device
}