一些儀器允許傳輸在一次詢問中傳輸大數據片。典型例子是示波器,可以傳輸整個電壓波形。或者波形發生器,可以傳輸需要產生的整個波形數據。像這樣的數據傳輸有兩種方法:ASCII方式(慢,可讀)或者二進制(快,難於調試)。PyVisa提供了這兩種傳輸方式:pyvisa.resources.MessageBasedResource.query_ascii_values() 和 pyvisa.resources.MessageBasedResource.query_binary_values()。在預先設置好的情況下,可以使用pyvisa.resources.MessageBasedResource.query_values()。
讀ASCII數據
如果示波器配置成,相應”CURV?“命令傳輸二進制數據,可以這樣獲取數據:
|
values是包含波形信息的數據列表。
很多情況下,不希望是列表類型,而是不同的容器類型,比如numpy.array;可以這樣處理數據:
|
有時候避免中間列表是有效的,在這種情況下可以在query方法中定義容器。
|
在容器中,可以調用任何可迭代的類型。
一些儀器的二進制數據編碼不是十進制而是16進制或8進制,後者需要接收字符串類型,這些情況下可以設置converter。例如,接收16進制整形:
|
converter是python數據類型編碼(https://docs.python.org/3/library/string.html#formatspec)的一種。但是如果需要,可以設置一個參數,默認converter是”f“。
最後,有些設備返回特殊間隔的數據。比如,返回數據間隔符號是”$“,可以這樣調用:
|
可以創建函數接收字符串,轉化爲iterable類型,默認的間隔符是逗號”,“。
讀二進制數據
如果示波器設置成響應”CURV?“命令返回二進制數據,需要確認數據類型(uint8,int8,single,double等)。PyVISA採用類似struct module命名轉換(https://docs.python.org/3/library/struct.html#format-characters)。還需要確認大小端,PyVISA默認按小端,如大端double類型d:
|
還可以跟前面一樣,設置不同的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>是存放數據的參數名。
|
並且也可以使用converter代碼。
|
converter可以是任何一種Python字符串類型。也可以自定義一個單字符表示的字符串類型。默認converter是‘f’。
間隔符也可以在query_ascii_values中定義。
|
也可以定義返回字符串的迭代器。默認間隔符是“,”。
寫二進制數據
更新波形發生器的波形數據,可以使用命令WLISt:WAVeform:DATA <waveform name>,<function data>,其中<waveform name>是存放數據的參數名。
|
還可以自定義datatype和endianness。
|
調試代碼(當事情不是應該的樣子)
PyVisa提供了簡單的傳輸數據到設備的方法。以上描述的方法能夠解決99%的情況,但仍有一些特殊的設備不遵循標準的協議,所以不適用前面的連接設備的方法。
在這些情況下,可以採用如下方式。
|
然後,你可以編寫邏輯處理數據。
如果read_raw調用返回錯誤,可以試試讀幾個bytes。
|
如果還是錯誤,可能是需要等待更長時間,或者指令沒有被理解。