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

时间:2013-03-17 22:47:38

标签: c# com serial-port gpib

我目前正在寻找通过C#与SCPI兼容设备进行通信的不同可能性。我已经通过COM接口在LabWindows / CVI(语言:C)中编写了我的第一个代码,并按照我的说法完全“手动”完成:

ComOpen(ComId, "Com1",....);
ComWrite("SYST:...\r");
ComRead(&value)`

像这样的东西。问题是对我来说,我不喜欢纯粹的C和缺乏OOP只是愚蠢,因为我有真正想要交流的对象。亲爱的National Instruments,为什么不使用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?

另一种解决方案是使用National Instruments VISA包。但是我不喜欢使用NI提供的专有软件包的想法(我认为在使用CVI之后我觉得对NI有了新的反感)。

您是否可以提供代码段或文档来处理此问题?您是否通过使用VISA获得了任何经验?我可以使用套接字进行COM / GPIB通信吗?

顺便说一句:如何在代码片段中创建新行?既不输入也不 Shift + 输入,\ r,\ n,\对我有用...

1 个答案:

答案 0 :(得分:0)

您可以使用.NET SerialPortSocket(不使用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
    }

}

你甚至可以通过创建一般连接的接口(比方说 - GenConnection)来改进你的类,以便能够使用任何类型的连接(SerialPort,Socket,GPIB ......)(使用常见的读/写方法) ),然后创建实现此接口的连接类型的子项 - 然后每个设备将只有GenConnection实例而不“知道”它实际上是哪种连接(只是为每种连接重载构造函数)

要记住几点:

  • 编程手册有助于避免常见错误
  • 连接配置(波特率,奇偶校验......)
  • 行尾字符,您应该记住发送和分开读数 设备末尾 - 通常是<CR><CR><LF>(C#中的“\ r”或“\ r \ n”)。

    SerialPort的ReadLine&amp; WriteLine正在使用指定的SerialPort的NewLine属性

  • 为您完成此操作
  • 您可以使用TeraTerm播放端口和套接字,以便按预期查看所有内容