【问题标题】:Communication via GPIB and RS-232/COM using SCPI使用 SCPI 通过 GPIB 和 RS-232/COM 进行通信
【发布时间】:2013-03-17 22:47:37
【问题描述】:

我目前正在寻找通过 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 产生了新的排斥)。

您能否提供代码 sn-ps 或文档来处理此问题?你有使用VISA的经验吗?我可以使用套接字进行 COM/GPIB 通信吗?

顺便说一句:如何在代码 sn-ps 中创建新行? enter 和 Shift + Enter, \r, \n, \ 都不适合我...

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 另外,你指的是什么“code sn-ps”?
  • 另外,问题是wtf?
  • 好吧,我的整个标题都充满了标签。但它总结了我的全文。为什么你还没有删除GPIB、RS232/COM?甚至 SCPI 也是一个很好的标签……而不是标题:通过和使用进行通信。会好很多
  • 输入代码只需将代码缩进四个空格。

标签: c# com serial-port gpib


【解决方案1】:

您可以使用 .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 的 ReadLineWriteLine 正在使用指定的 SerialPort 的 NewLine 属性为您执行此操作

  • 您可以使用TeraTerm 使用您的端口和套接字来查看预期的一切

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多