Visual Studio 2015 年使用 VISA 库进行通信时出现问题
Visual Studio 2015 has problems communicating using VISA Libraries
我在使用 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"
此外,电源的错误状态为:"Error -420, Query UNTERMINATED"
该代码不适用于 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。
http://download.ni.com/support/softlib//visa/NI-VISA/15.0/Windows/readme.html
微软Visual Studio支持
下面table列出了该版本NI-VISA支持的编程语言和微软Visual Studio版本。
早期版本的NI-VISA支持其他应用软件和语言版本。有关 Visual Studio 与早期版本 VISA 兼容性的更多信息,请参阅 ni.com/info 并输入信息代码 NETlegacydrivers。要查找和下载早期版本的驱动程序,请参阅 ni.com/downloads.
Visual Studio Versions Support by NI-VISA:
Visual C++ MFC1 -------------- 2008
Framework 3.5 Languages (Visual C# and Visual Basic .NET) -- 2008
.NET Framework 4.0 Languages (Visual C# and Visual Basic .NET)-- 2010
.NET Framework 4.5 Languages (Visual C# and 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 年不需要 "true",而 2015 年为什么需要它...哦,好吧。
您是否尝试过 ReadBytes 方法?此方法从设备读取固定数量的字节。您遇到的错误很可能是因为签证驱动程序尝试读取数据,直到收到您从未明确设置的终止字符。
尝试将 TerminationCharacter 属性 设置为 \n 或 \r(取决于仪器),它应该可以工作。此外,您可能还想将它添加到您发送的命令中,这样仪器就不会再用这个错误 (-420) 来打扰您了。
我确认: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);
}
}
</pre>
我在使用 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"
此外,电源的错误状态为:"Error -420, Query UNTERMINATED"
该代码不适用于 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。
http://download.ni.com/support/softlib//visa/NI-VISA/15.0/Windows/readme.html
微软Visual Studio支持
下面table列出了该版本NI-VISA支持的编程语言和微软Visual Studio版本。
早期版本的NI-VISA支持其他应用软件和语言版本。有关 Visual Studio 与早期版本 VISA 兼容性的更多信息,请参阅 ni.com/info 并输入信息代码 NETlegacydrivers。要查找和下载早期版本的驱动程序,请参阅 ni.com/downloads.
Visual Studio Versions Support by NI-VISA:
Visual C++ MFC1 -------------- 2008
Framework 3.5 Languages (Visual C# and Visual Basic .NET) -- 2008
.NET Framework 4.0 Languages (Visual C# and Visual Basic .NET)-- 2010
.NET Framework 4.5 Languages (Visual C# and 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 年不需要 "true",而 2015 年为什么需要它...哦,好吧。
您是否尝试过 ReadBytes 方法?此方法从设备读取固定数量的字节。您遇到的错误很可能是因为签证驱动程序尝试读取数据,直到收到您从未明确设置的终止字符。
尝试将 TerminationCharacter 属性 设置为 \n 或 \r(取决于仪器),它应该可以工作。此外,您可能还想将它添加到您发送的命令中,这样仪器就不会再用这个错误 (-420) 来打扰您了。
我确认: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);
}
}
</pre>