Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SCPI通过GPIB和RS-232/COM进行通信_C#_Com_Serial Port_Gpib - Fatal编程技术网

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

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来控制对象 现在有人给了我一个提示,我应该查看全局

我目前正在寻找通过C#与兼容设备进行通信的各种可能性。我已经通过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);
与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的
    换行
    属性为您执行此操作

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

我已编辑了您的标题。请看,“,共识是“不,他们不应该”。还有,你指的是什么“代码片段”?还有,wtf是个问题?我的整个标题都是标签。但它总结了我的全文。为什么你没有删除GPIB,RS232/COM呢?即使SCPI也是一个很好的标签。。。而不是标题:通过和使用进行通信。输入代码最好是将代码缩进四个空格。
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
    }