【问题标题】:Python: Get device "model" using pyvisa or pyserialPython:使用 pyvisa 或 pyserial 获取设备“模型”
【发布时间】:2015-11-03 13:07:51
【问题描述】:

我编写了一个数据采集程序/脚本,可与我们合作开发的设备配合使用。问题是我只能从这个设备上读取。无法写入,因此无法使用串行“?IDN*”命令知道这是什么设备。

唯一定义此设备的是它的“型号”,可以在 Windows 控制面板的“设备和打印机”中看到。如下图所示:

设计该设备的人能够创建一个 labview 简单程序,该程序通过 NI-VISA 通过称为“Intf Inst Name”的东西从设备中提取此名称,该名称称为“接口信息:接口描述”。

如果我获得此型号名称并将其与 pyvisa 设备名称进行比较,我将能够自动检测我们设备的存在,这是非常重要的,以防 USB 断开连接。这是因为 VISA 通过一个在每台计算机上可能不同的名称打开设备,但这个名称“GPS DATA LOGGER”在任何地方始终都是相同的。

我需要这个解决方案是跨平台的。这就是为什么我需要使用 pyvisa 或 pyserial。尽管任何跨平台替代方案都可以。

所以我的问题很简单:如何使用 pyvisa/pyserial 找到与设备型号对应的型号名称(在我的情况下为“GPS DATA LOGGER”)?

请询问您可能需要的任何其他信息。


更新

我了解到有一个名为“VI_ATTR_INTF_INST_NAME”的“属性”pyvisa 可以获得这个名称,但我不知道如何使用它。有谁知道如何读取这些属性?

【问题讨论】:

  • @KobiK 是的!这是一个 USB 设备。
  • 你可以试试pyusb 或infi device manager mapper,真的很简单,而且可以映射设备管理器
  • @KobiK 谢谢。我会试试的。
  • @KobiK 不幸的是,无法使用 pyusb 或 infi 设备管理器映射器读取 VISA 名称...

标签: python serial-port usb visa data-acquisition


【解决方案1】:

我找到了方法。不幸的是,这涉及打开您计算机中的每个 VISA 设备。我写了一个小的 pyvisa 函数,它将用 cmets 为你完成任务。该函数返回所有包含作为参数提及的型号名称/描述符的设备:

import pyvisa

def findInstrumentByDescriptor(descriptor):
    devName = descriptor

    rm = pyvisa.ResourceManager()
    com_names=rm.list_resources()
    devicesFound = []

    #loop over all devices, open them, and check the descriptor
    for com in range(len(com_names)):
        try:
            #try to open instrument, if failed, just skip to the next device
            my_instrument=rm.open_resource(com_names[com])
        except:
            print("Failed to open " + com_names[com])
            continue
        try:
            # VI_ATTR_INTF_INST_NAME is 3221160169, it contains the model name "GPS DATA LOGGER" (check pyvisa manual for other VISA attributes)
            modelStr = my_instrument.get_visa_attribute(3221160169)

            #search for the string you need inside the VISA attribute
            if modelStr.find(devName) >= 0:
                #if found, will be added to the array devicesFound
                devicesFound.append(com_names[com])
                my_instrument.close()
        except:
            #if exception is thrown here, then the device should be closed
            my_instrument.close()

    #return the list of devices that contain the VISA attribute required
    return devicesFound



#here's the main call
print(findInstrumentByDescriptor("GPS DATA LOGGER"))

【讨论】:

    【解决方案2】:

    pyvisa 有一个可选的query parameter 用于list_resources(),您可以使用它来将搜索范围缩小到您的设备。 syntax 就像一个正则表达式。

    试试这个:

    from string import Template
    VI_ATTR_INTF_INST_NAME = 3221160169
    device_name = "GPS DATA LOGGER"
    entries = dict(
      ATTR = VI_ATTR_INTF_INST_NAME,
      NAME = device_name )
    query_template = Template(u'ASRL?*INSTR{$ATTR == "$NAME"}')
    query = query_template.substitute(entries)
    
    rm = visa.ResourceManager()
    rm.list_resources(query)
    

    【讨论】:

    • 我会尝试一段时间并给你我的反馈。谢谢:)
    • 我想使用这个解决方案,因为它更短,但我无法让它工作......我想它需要仪器的确切属性名称,而之前的解决方案允许为部分名称。我会想办法解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2015-05-16
    • 1970-01-01
    相关资源
    最近更新 更多