Visual Studio 2015在使用VISA库时存在通信问题

本文关键字:存在 通信 问题 VISA Studio 2015 Visual | 更新日期: 2023-09-27 18:08:51

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

我有一些c#代码,我在Visual Studio 2015中编译,它不起作用。但是,如果我在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"

同时,电源有一个错误状态:" error -420, Query UNTERMINATED"

代码不能在VS2015中工作,但它可以在VS2012中工作。(在VS2012我没有得到错误。)

我已经尝试从keyysight下载最新的驱动程序,它仍然不工作(www.keysight.com/find/iosuitedownload)。

有没有人知道为什么它会打破VS2015,但与VS2012工作?

我查了"Quere Unterminated",有人说它可能是一个缺失的终止字符"'n"。我试过将"'n"添加到两个writestring中,但它仍然失败。


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

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

我也试过添加:

myDmm.IO.TerminationCharacter

Visual Studio 2015在使用VISA库时存在通信问题

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

框架3.5语言(Visual c#和Visual Basic .NET)—2008

。.NET Framework 4.0语言(Visual c#和Visual Basic .NET)——2010

。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.

我不知道为什么"true"在2012年不需要,为什么在2015年需要…哦。

我确认:方法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);
      }
    } 

您尝试过ReadBytes方法吗?此方法从设备中读取固定数量的字节。您遇到的错误很可能是因为visa驱动程序试图读取数据,直到接收到您从未显式设置的终止字符。

尝试将TerminationCharacter属性设置为'n或'r(取决于仪器),它应该可以工作。此外,您可能还想将它添加到您发送的命令中,这样仪器就不会再以此错误(-420)打扰您了。