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
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)打扰您了。