Python: 使用 pyvisa 或 pyserial 获取设备 "model"
Python: Get device "model" using pyvisa or pyserial
我写了一个数据采集器 program/script,它可以与我们合作开发的设备一起使用。问题是我只能从这个设备读取。无法写入,因此无法使用串行“?IDN*”命令来了解这是什么设备。
唯一定义此设备的是它的 "Model",可以在 Windows 的控制面板的 "Devices and Printers" 中看到。如下图所示:
设计该设备的人能够创建一个 labview 简单程序,通过 NI-VISA 通过名为 "Intf Inst Name" 的东西从设备中提取此名称,称为 "Interface Information:Interface Description"。
如果我得到这个型号名称并将其与 pyvisa 设备名称进行比较,我将能够自动检测我们的设备是否存在,这是一个重要的东西,以防 USB 断开连接发生。这是因为 VISA 通过在每台计算机上可能不同的名称打开设备,但是这个名称 "GPS DATA LOGGER" 在任何地方都是相同的。
我需要这个解决方案是跨平台的。这就是为什么我需要使用 pyvisa 或 pyserial。尽管任何跨平台替代方案都可以。
所以我的问题很简单:我如何使用pyvisa/pyserial找到与设备型号对应的型号名称(在我的例子中是"GPS DATA LOGGER") ?
请询问您可能需要的任何其他信息。
更新
我了解到有一个名为 "VI_ATTR_INTF_INST_NAME" 的 "attribute" pyvisa 会得到这个名字,但我不知道如何使用它。有谁知道如何读取这些属性?
我找到了方法。不幸的是,它涉及打开您计算机中的每个 VISA 设备。我写了一个小的 pyvisa 函数,它将为你完成带有评论的任务。函数 returns 所有包含型号 name/descriptor 的设备作为参数提到:
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"))
pyvisa
有一个可选的 query
parameter for list_resources()
, which you can use to narrow the scope of your search to just your device. The 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)
我写了一个数据采集器 program/script,它可以与我们合作开发的设备一起使用。问题是我只能从这个设备读取。无法写入,因此无法使用串行“?IDN*”命令来了解这是什么设备。
唯一定义此设备的是它的 "Model",可以在 Windows 的控制面板的 "Devices and Printers" 中看到。如下图所示:
设计该设备的人能够创建一个 labview 简单程序,通过 NI-VISA 通过名为 "Intf Inst Name" 的东西从设备中提取此名称,称为 "Interface Information:Interface Description"。
如果我得到这个型号名称并将其与 pyvisa 设备名称进行比较,我将能够自动检测我们的设备是否存在,这是一个重要的东西,以防 USB 断开连接发生。这是因为 VISA 通过在每台计算机上可能不同的名称打开设备,但是这个名称 "GPS DATA LOGGER" 在任何地方都是相同的。
我需要这个解决方案是跨平台的。这就是为什么我需要使用 pyvisa 或 pyserial。尽管任何跨平台替代方案都可以。
所以我的问题很简单:我如何使用pyvisa/pyserial找到与设备型号对应的型号名称(在我的例子中是"GPS DATA LOGGER") ?
请询问您可能需要的任何其他信息。
更新
我了解到有一个名为 "VI_ATTR_INTF_INST_NAME" 的 "attribute" pyvisa 会得到这个名字,但我不知道如何使用它。有谁知道如何读取这些属性?
我找到了方法。不幸的是,它涉及打开您计算机中的每个 VISA 设备。我写了一个小的 pyvisa 函数,它将为你完成带有评论的任务。函数 returns 所有包含型号 name/descriptor 的设备作为参数提到:
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"))
pyvisa
有一个可选的 query
parameter for list_resources()
, which you can use to narrow the scope of your search to just your device. The 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)