【问题标题】:Device Communication with VISA work in Python, but not in C++与 VISA 的设备通信在 Python 中工作,但在 C++ 中不工作
【发布时间】:2019-08-01 10:52:58
【问题描述】:

我正在学习使用 VISA(一组 National Instruments 模块)与一些 NI 设备进行通信。我以前使用过 Python,但现在我也在学习使用 C++。

我在使用 C++ 中的 VISA 模块连接到设备时遇到困难,但在 Python 中使用 PyVisa 模块连接到设备时没有问题。

我附上了我正在使用的两个 sn-ps 代码。 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;
}

【问题讨论】:

  • 抱歉,它确实存在于 main() 函数中,我只是将代码剔除以使其更易于阅读。
  • 我已将 main() 函数放回示例中
  • 您使用的是C API,而不是在失败时抛出异常的C++ API。您需要检查返回值以确保所有调用都成功。
  • 我对 VISA 不熟悉,但是你用instr_NanoPZviOpen 打了两次电话。也许这是个问题。你真的应该检查返回值。 viOpen 返回什么?此处可能出现的错误代码:zone.ni.com/reference/en-XX/help/370131S-01/ni-visa/viopen
  • 总是检查返回值:)

标签: python c++ visa


【解决方案1】:
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);

【讨论】:

  • 这绝对是一个需要修复的错误。不幸的是,它仍然无法正常工作。我会看看是否有任何其他命令返回失败的交付状态。
  • 太好了,在适用的地方使用预定义的宏。由于您正在学习 C++,因此您还可以通过为 visa 创建 C++ API 来练习资源管理,这样就可以一次完成检查返回值的繁琐工作,而不是每次需要使用接口时完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多