与 VISA 的设备通信在 Python 中有效,但在 C++ 中无效
Device Communication with VISA work in Python, but not in C++
我正在学习使用 VISA(National Instruments 的一组模块)与一些 NI 设备进行通信。我以前使用Python,但现在我也在学习使用C++。
我在使用 C++ 中的 VISA 模块连接到设备时遇到困难,但在 Python 中使用 PyVisa 模块连接到设备时没有问题。
我附上了我正在使用的两段代码。 Python 代码有效,C++ 无效,尽管它们应该以相同的方式运行。有人知道我做错了什么吗?
###################
# PYVISA COMMANDS #
###################
import visa as vi
import time
try:
# Create the resource manager
rm = vi.ResourceManager()
# Connect to resource from USB
myI = rm.open_resource('ASRL3::INSTR')
# Setup resource identities for NanoPZ Control Box
myI.flow_control = 6
myI.read_termination = 'CR'
myI.write_termination = 'CR'
myI.timeout = 3000
myI.baud_rate = 19200
myI.stopbits = 1.0
myI = rm.open_resource('ASRL3::INSTR')
myI.write('1MX2') # A Very simple command, this works in Python
except:
"Hello"
# Close Communications
myI.close()
//////////////
// C++ VISA //
//////////////
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include "visa.h"
int main() {
ViSession defaultRM, instr_NanoPZ; // The device is NanoPZ
// Open a channel with the VI Module
viOpenDefaultRM(&defaultRM);
Sleep(1000);
// Open a channel with the instrument we want to use
viOpen(defaultRM, "ASRL3::INSTR", VI_NULL, VI_NULL, &instr_NanoPZ);
Sleep(1000);
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_BAUD, (ViUInt32) 19200); // Baud Rate
viSetAttribute(instr_NanoPZ, VI_ATTR_TMO_VALUE, (ViUInt32) 3000); // Timeout
viSetAttribute(instr_NanoPZ, VI_ATTR_TERMCHAR, 0x0D);
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_FLOW_CNTRL, (ViUInt16) 6); // Flow control
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_STOP_BITS, (ViUInt16) 1.0); // Stop bits
viOpen(defaultRM, "ASRL3::INSTR", VI_NULL, VI_NULL, &instr_NanoPZ);
Sleep(1000);
viPrintf(instr_NanoPZ, "1MX2"); // The same, simple command, does not work in C++
Sleep(1000);
viClose(instr_NanoPZ);
viClose(defaultRM);
return 0;
}
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_STOP_BITS, (ViUInt16) 1.0);
应该是
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_STOP_BITS, VI_ASRL_STOP_ONE);
并在
中替换6
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_FLOW_CNTRL, (ViUInt16) 6);
使用宏定义所需的流控制类型。
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_FLOW_CNTRL,
VI_ASRL_FLOW_RTS_CTS | VI_ASRL_FLOW_DTR_DSR);
我正在学习使用 VISA(National Instruments 的一组模块)与一些 NI 设备进行通信。我以前使用Python,但现在我也在学习使用C++。
我在使用 C++ 中的 VISA 模块连接到设备时遇到困难,但在 Python 中使用 PyVisa 模块连接到设备时没有问题。
我附上了我正在使用的两段代码。 Python 代码有效,C++ 无效,尽管它们应该以相同的方式运行。有人知道我做错了什么吗?
###################
# PYVISA COMMANDS #
###################
import visa as vi
import time
try:
# Create the resource manager
rm = vi.ResourceManager()
# Connect to resource from USB
myI = rm.open_resource('ASRL3::INSTR')
# Setup resource identities for NanoPZ Control Box
myI.flow_control = 6
myI.read_termination = 'CR'
myI.write_termination = 'CR'
myI.timeout = 3000
myI.baud_rate = 19200
myI.stopbits = 1.0
myI = rm.open_resource('ASRL3::INSTR')
myI.write('1MX2') # A Very simple command, this works in Python
except:
"Hello"
# Close Communications
myI.close()
//////////////
// C++ VISA //
//////////////
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include "visa.h"
int main() {
ViSession defaultRM, instr_NanoPZ; // The device is NanoPZ
// Open a channel with the VI Module
viOpenDefaultRM(&defaultRM);
Sleep(1000);
// Open a channel with the instrument we want to use
viOpen(defaultRM, "ASRL3::INSTR", VI_NULL, VI_NULL, &instr_NanoPZ);
Sleep(1000);
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_BAUD, (ViUInt32) 19200); // Baud Rate
viSetAttribute(instr_NanoPZ, VI_ATTR_TMO_VALUE, (ViUInt32) 3000); // Timeout
viSetAttribute(instr_NanoPZ, VI_ATTR_TERMCHAR, 0x0D);
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_FLOW_CNTRL, (ViUInt16) 6); // Flow control
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_STOP_BITS, (ViUInt16) 1.0); // Stop bits
viOpen(defaultRM, "ASRL3::INSTR", VI_NULL, VI_NULL, &instr_NanoPZ);
Sleep(1000);
viPrintf(instr_NanoPZ, "1MX2"); // The same, simple command, does not work in C++
Sleep(1000);
viClose(instr_NanoPZ);
viClose(defaultRM);
return 0;
}
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_STOP_BITS, (ViUInt16) 1.0);
应该是
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_STOP_BITS, VI_ASRL_STOP_ONE);
并在
中替换6
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_FLOW_CNTRL, (ViUInt16) 6);
使用宏定义所需的流控制类型。
viSetAttribute(instr_NanoPZ, VI_ATTR_ASRL_FLOW_CNTRL,
VI_ASRL_FLOW_RTS_CTS | VI_ASRL_FLOW_DTR_DSR);