2013-03-17 48 views
0

我目前正在尋找不同的可能性來通過C#與SCPI兼容的設備進行通信。通過COM接口:(C語言),並做得相當「手動」,我會說:我已經寫了我在LabWindows/CVI第一碼使用SCPI通過GPIB和RS-232/COM進行通信

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

這樣的事情。問題在於我不喜歡純C,而OOP的缺乏只是愚蠢的,因爲我有真正想要溝通的對象。親愛的美國國家儀器,爲什麼不使用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的VISA包。但我不喜歡使用NI提供的專有軟件包的想法(我認爲在使用CVI之後,我感覺到新開發的對NI的斥力)。

你能提供代碼片段或文檔來處理這個問題嗎?你有沒有使用VISA做過任何體驗?我可以使用套接字進行COM/GPIB通信嗎?

順便說一句:如何在代碼片段中創建新行?無論是進入還是 + 輸入,\ r,\ n,\對我的作品......

+0

我已經編輯您的標題扮演這樣做是爲了你。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-03-17 22:48:38

+0

另外,你指的是什麼「代碼片段」? – 2013-03-17 22:48:54

+1

此外,跆拳道是問題? – 2013-03-17 23:15:17

回答

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,插座類, 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 
    } 

}

你甚至可以改善你的類必須使用任何類型的連接能力(SerialPo rt,Socket,GPIB ...)通過創建一個通用連接(使用通用讀/寫方法)的接口(可以說是--GenConnection),然後創建實現此接口的連接類型的子接口 - 然後,每個設備只有GenConnection實例,而不「知道」哪一種連接它真的是(只是重載構造爲每一種連接)

幾點要牢記:

  • 編程手冊,幫助避免常見錯誤
  • 連接配置(波特率,奇偶...)
  • End請注意發送並將設備行尾的讀數 分開 - 通常爲<CR><CR><LF>(「\ r」或C#中的「\ r \ n」)。

    一個串口的ReadLine & WriteLine使用指定的SerialPort的NewLine財產

  • 您可以使用TeraTerm您的端口和插槽看到的一切如預期