PyVisa教程-用Python控制儀器【4,讀寫數據】

原文鏈接:https://pyvisa.readthedocs.io/en/stable/

一些儀器允許傳輸在一次詢問中傳輸大數據片。典型例子是示波器,可以傳輸整個電壓波形。或者波形發生器,可以傳輸需要產生的整個波形數據。像這樣的數據傳輸有兩種方法:ASCII方式(慢,可讀)或者二進制(快,難於調試)。PyVisa提供了這兩種傳輸方式:pyvisa.resources.MessageBasedResource.query_ascii_values() 和 pyvisa.resources.MessageBasedResource.query_binary_values()。在預先設置好的情況下,可以使用pyvisa.resources.MessageBasedResource.query_values()。

讀ASCII數據

如果示波器配置成,相應”CURV?“命令傳輸二進制數據,可以這樣獲取數據:

>>> values = inst.query_ascii_values('CURV?')

values是包含波形信息的數據列表。

很多情況下,不希望是列表類型,而是不同的容器類型,比如numpy.array;可以這樣處理數據:

>>> values = np.array(inst.query_ascii_values('CURV?'))

有時候避免中間列表是有效的,在這種情況下可以在query方法中定義容器。

>>> values = inst.query_ascii_values('CURV?', container=numpy.array)

在容器中,可以調用任何可迭代的類型。

一些儀器的二進制數據編碼不是十進制而是16進制或8進制,後者需要接收字符串類型,這些情況下可以設置converter。例如,接收16進制整形:

>>> values = inst.query_ascii_values('CURV?', converter='x')

converter是python數據類型編碼(https://docs.python.org/3/library/string.html#formatspec)的一種。但是如果需要,可以設置一個參數,默認converter是”f“。

最後,有些設備返回特殊間隔的數據。比如,返回數據間隔符號是”$“,可以這樣調用:

>>> values = inst.query_ascii_values('CURV?', separator='$')

可以創建函數接收字符串,轉化爲iterable類型,默認的間隔符是逗號”,“。

讀二進制數據

如果示波器設置成響應”CURV?“命令返回二進制數據,需要確認數據類型(uint8,int8,single,double等)。PyVISA採用類似struct module命名轉換(https://docs.python.org/3/library/struct.html#format-characters)。還需要確認大小端,PyVISA默認按小端,如大端double類型d:

values = inst.query_binary_values('CURV?', datatype='d', is_big_endian=True)

還可以跟前面一樣,設置不同的cotainer。

默認,PyVISA按照IEEE轉換格式設置數據。如果設備支持HP數據格式,可以設置參數header_fmt='hp'給read_binary_values;如果設備不用任何頭,直接設置header_fmt='empty'。

根據PyVISA默認設置,設備將增加結束字符表徵數據塊的結束,以保證讀取正確。一些儀器做了很好的設置,也有些儀器忽略了結束字符,這種情況下讀取操作將產生超時。這種情況下,首先確認通過read_raw函數讀取儀器,檢查數據長度是否匹配儀器。如果這樣,需要設置expect_termination=False,PyVISA將不檢查結束字符。

寫ASCII數據

更新波形發生器的波形數據,可以使用命令WLISt:WAVeform:DATA <waveform name>,<function data>,其中<waveform name>是存放數據的參數名。

>>> values = list(range(100))

>>> inst.write_ascii_values('WLISt:WAVeform:DATA somename,', values)

並且也可以使用converter代碼。

>>> inst.write_ascii_values('WLISt:WAVeform:DATA somename,', values, converter='x')

converter可以是任何一種Python字符串類型。也可以自定義一個單字符表示的字符串類型。默認converter是‘f’。

間隔符也可以在query_ascii_values中定義。

>>> inst.write_ascii_values('WLISt:WAVeform:DATA somename,', values, converter='x', separator='$')

也可以定義返回字符串的迭代器。默認間隔符是“,”。

寫二進制數據

更新波形發生器的波形數據,可以使用命令WLISt:WAVeform:DATA <waveform name>,<function data>,其中<waveform name>是存放數據的參數名。

>>> values = list(range(100))

>>> inst.write_binary_values('WLISt:WAVeform:DATA somename,', values)

還可以自定義datatype和endianness。

>>> inst.write_binary_values('WLISt:WAVeform:DATA somename,', values, datatype='d', is_big_endian=False)

調試代碼(當事情不是應該的樣子)

PyVisa提供了簡單的傳輸數據到設備的方法。以上描述的方法能夠解決99%的情況,但仍有一些特殊的設備不遵循標準的協議,所以不適用前面的連接設備的方法。

在這些情況下,可以採用如下方式。

>>> inst.write('CURV?')

>>> data = inst.read_raw()

然後,你可以編寫邏輯處理數據。

如果read_raw調用返回錯誤,可以試試讀幾個bytes。

>>> inst.write('CURV?')

>>> data = inst.read_bytes(1)

如果還是錯誤,可能是需要等待更長時間,或者指令沒有被理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章