2015-11-03 357 views
1

我編寫了一個數據採集程序/腳本,它與我們合作開發的設備一起工作。問題是我可以只從這個設備讀取。不可能寫入,因此無法使用串行「?IDN *」命令來知道這是什麼設備。Python:使用pyvisa或pyserial獲取設備「model」

定義此設備的唯一方法是其「型號」,可在Windows控制面板的「設備和打印機」中看到。下圖顯示了它:

enter image description here

誰設計的設備的傢伙能夠創建一個LabVIEW簡單的程序,通過所謂的「INTF出師表名稱」從通過NI-VISA的設備提取這個名字,這被稱爲「接口信息:接口描述」。

如果我得到這個型號名稱,並將其與pyvisa設備名稱進行比較,我將能夠自動檢測設備的存在,這是一個重要的事情,以防萬一USB斷開連接發生。這是因爲VISA通過在每臺計算機上可能不同的名稱打開設備,但這個名稱「GPS DATA LOGGER」在任何地方都是一樣的。

我需要這個解決方案是跨平臺的。這就是爲什麼我需要使用pyvisa或pyserial。儘管任何跨平臺的替代方案都可以。

所以我的問題簡單地:我如何使用pyvisa/pyserial找到對應於設備模型的模型名稱(在我的例子中是「GPS DATA LOGGER」)?

請查詢您可能需要的任何其他信息。


更新

我得知有一個「屬性」 pyvisa名爲「VI_ATTR_INTF_INST_NAME」,將得到這個名字,但我不知道如何使用它。有誰知道如何閱讀這些屬性?

+0

它是一個USB設備? –

+0

@KobiK是的!這是一個USB設備。 –

+0

你可以試試[pyusb](http://walac.github.io/pyusb/)或[infi設備管理器映射器](https://github.com/Infinidat/infi.devicemanager),它非常簡單,它可以映射設備管理員 –

回答

0

我找到了辦法。不幸的是,它涉及到打開您電腦中的每個VISA設備。我寫了一個小的pyvisa函數,可以爲你提供評論。該函數返回所有包含的參數中提及的型號名稱/描述符的設備:

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")) 
0

pyvisalist_resources()可選query parameter,你可以用它來縮小搜索範圍,只是你的設備的範圍。這個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) 
+0

我會嘗試一些時間並給你我的反饋。謝謝 :) –