通信通过GPIB和RS-232/COM使用SCPI

本文关键字:COM 使用 SCPI RS-232 GPIB 通信 | 更新日期: 2023-09-27 18:04:36

我目前正在寻找通过c#与scp兼容的设备进行通信的不同可能性。我已经通过COM接口在LabWindows/CVI(语言:C)中编写了我的第一个代码,并且像我所说的那样"手动"完成了:

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);

与scsi设备建立面向对象的通信。因为我真的很喜欢c#,所以我想在接下来的几周尝试一下。

但是我真的看不到连接设置,因为resourceName似乎只是一个名称,以便在连接已经设置时释放所考虑的设备和其他设置。IIviDCPwr的实例如何知道应该使用哪个连接(TCP/IP, COM或GPIB) ?

我只看到过使用套接字的TCP/IP解决方案。但我认为这并不适用于COM和GPIB?

另一个解决方案是使用美国国家仪器公司的visa包。但是我不喜欢使用NI提供的专有软件包的想法(我认为在使用CVI之后,我对NI产生了新的排斥)。

你能提供代码片段或文档来处理这个问题吗?你有使用VISA的经历吗?我可以使用com/gpib通信的插座吗?

BTW:如何在代码片段中创建新行?既不输入也不输入Shift + 输入, 'r, 'n, ' works for me

通信通过GPIB和RS-232/COM使用SCPI

您可以使用。net串行端口和套接字(不使用VISA)通过使用它们的读/写方法与您的设备进行通信。关于GPIB,你的硬件应该有一个。net驱动程序,使用类似的方法。

如何使用SerialPort(使用一些伪scpi)与设备通信的一些示例

        SerialPort port = new SerialPort("COM1", 9600);
        port.Open();
        port.WriteLine(":DEVICE:OUT 1"); //turn on
        port.WriteLine(":DEVICE:MEAS:VOLT?"); //measure voltage
        float v = float.Parse(port.ReadLine()); //reading from device
        Console.WriteLine("The measured voltage is " + v );

现在你可以创建你的设备类,其中每个实例将有他自己的协议(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
    }

}

你甚至可以改进你的类有能力使用任何类型的连接(SerialPort, Socket, GPIB…)通过创建一个接口(让我们说- GenConnection)的通用连接(与常见的读/写方法),然后创建子你的连接类型实现这个接口-然后你的每个设备将只有GenConnection实例,而不"知道"它是哪一种连接(只是重载每种连接的构造函数)

注意事项:

    编程手册帮助避免常见错误
  • 连接配置(波特,奇偶校验…)
  • 行结束字符,应记住发送和分开读数与设备的行端-通常是<CR><CR><LF>("'r"或"'r'n"在c#中)。

    串口的ReadLine &WriteLine正在为您使用指定的SerialPort的NewLine属性

  • 您可以使用TeraTerm来查看端口和套接字的所有内容