Visual Studio 2015在使用VISA库进行通信时遇到问题

时间:2015-08-20 14:26:48

标签: c# visual-studio-2012 visual-studio-2015 visa

我在使用VISA-Com库与Keysight(N6700B)电源进行通信时遇到问题。

我有一些我在Visual Studio 2015中编译的C#代码,但它不起作用。但是,如果我在Visual Studio 2012中编译相同的代码,那么它可以工作。

基本上我只是在与设备进行简单的沟通:

using Ivi.Visa.Interop;
//...
string address = "USB0::2391::2311::MY54002380::0::INSTR";
ResourceManager rm = new ResourceManager();
FormattedIO488 myDmm = (IMessage)rm.Open(address , AccessMode.NO_LOCK, 2000, "");
myDmm.WriteString("*RST"); // reset the device
myDmm.WriteString("*IDN?"); // request the IDN string;
string IDN = myDmm.ReadString(); // This is where it fails, returning: "VI_ERROR_TMO: A timeout occurred"

此外,电源的错误状态为:"错误-420,查询未终止"

该代码不适用于VS2015,但它适用于VS2012。 (在VS2012中,我没有任何错误。)

我尝试从KeySight下载最新的驱动程序,但仍然无效(www.keysight.com/find/iosuitedownload)。

有没有人知道为什么它会破坏VS2015但与VS2012合作?

我抬起头来" Quere Unterminated"有人说它可能是一个失踪的终止角色" \ n"。我试过添加" \ n"对于两个writeStrings,它仍然失败。

编辑:我现在也尝试过(在不同的地方):

myDmm.IO.TerminationCharacterEnabled = true; // and = false 

myDmm.FlushWrite(); // also tried passing in "true" (default is 'false')

我也尝试添加:

myDmm.IO.TerminationCharacter

到WriteStrings。

3 个答案:

答案 0 :(得分:2)

http://download.ni.com/support/softlib//visa/NI-VISA/15.0/Windows/readme.html

Microsoft Visual Studio支持

下表列出了此版本NI-VISA支持的编程语言和Microsoft Visual Studio版本。

早期版本的NI-VISA支持其他应用软件和语言版本。有关Visual Studio与早期版本VISA兼容性的更多信息,请访问ni.com/info并输入信息代码NETlegacydrivers。要查找和下载早期版本的驱动程序,请访问ni.com/downloads。

  

NI-VISA的Visual Studio版本支持:

     

Visual C ++ MFC1 -------------- 2008

     

Framework 3.5语言(Visual C#和Visual Basic .NET) - 2008

     

.NET Framework 4.0语言(Visual C#和Visual Basic .NET) - 2010

     

.NET Framework 4.5语言(Visual C#和Visual Basic .NET) - 2012

显然驱动程序不能与VS2015一起工作......(不确定新版本是如何工作的......但没关系)

编辑,找到答案

来自NI-VISTA的人告诉我只需添加“true”作为第二个参数:

myDmm.WriteString("*RST",true); // reset the device
myDmm.WriteString("*IDN?",true); // request the IDN string;
string IDN = myDmm.ReadString(); // now it works.

我不确定为什么2012年不需要“真实”,以及为什么在2015年需要它......好吧。

答案 1 :(得分:2)

我确认:方法WriteString()(但不仅仅是这个)需要bool参数flushAndEND = true(默认值= false)才能完成命令。没有它,仪器无法解析指令。如果发送多个命令,仪器将无法分离和识别它们。

我建议您使用Keysight IO显示器来嗅探仪器和控制器(PC?)之间的通信。它是IO Libraries Suite(v17.1)的实用程序。

有关详细信息,请参阅附带的IFormattedIO488接口定义,属于参考Ivi.Visa.Interop。

using System.Runtime.InteropServices;

    namespace Ivi.Visa.Interop
    {
        [...]
        public interface IFormattedIO488
{
    [DispId(1610678274)]
    bool InstrumentBigEndian { get; set; }
    [DispId(1610678272)]
    IMessage IO { get; set; }

    void FlushRead();
    void FlushWrite(bool sendEND = false);
    dynamic ReadIEEEBlock(IEEEBinaryType type, bool seekToBlock = false, bool flushToEND = false);
    dynamic ReadList(IEEEASCIIType type = IEEEASCIIType.ASCIIType_Any, string listSeperator = ",;");
    dynamic ReadNumber(IEEEASCIIType type = IEEEASCIIType.ASCIIType_Any, bool flushToEND = false);
    string ReadString();
    void SetBufferSize(BufferMask mask, int size);
    void WriteIEEEBlock(string Command, object data, bool flushAndEND = false);
    void WriteList(ref object data, IEEEASCIIType type = IEEEASCIIType.ASCIIType_Any, string listSeperator = ",", bool flushAndEND = false);
    void WriteNumber(object data, IEEEASCIIType type = IEEEASCIIType.ASCIIType_Any, bool flushAndEND = false);
    void WriteString(string data, bool flushAndEND = false);
}

}`

答案 2 :(得分:1)

您是否尝试过ReadBytes方法?此方法从设备读取固定数量的字节。您最常遇到的错误可能是因为签证驱动程序尝试读取数据,直到收到您从未明确设置的终止字符。

尝试将TerminationCharacter属性设置为\ n或\ r \ n(取决于仪器),它应该可以工作。此外,您可能希望将其添加到您发送的命令中,因此仪器不再会因此错误(-420)而烦恼。