2017-05-12 54 views
0

因此,我使用pyvisa讓python與某些工具交談。我有這樣的代碼:UnicodeDecodeError:'ascii'編解碼器無法解碼從pyvisa設備讀取的字符串

self.receiver.write("mmem:data? \'traceData.DAT\'") 
    sleep(2) 
    data_string = self.receiver_visa.read() 

寫入部件是告訴儀器在哪裏可以找到數據,並等待2秒爲它找到它,然後使用read()方法來實際讀取的數據。該數據應該是這個樣子:

'#525817Type;ESU;\r\nVersion;4.73;\r\nDate;10.May 17;\r\nMode;ANALYZER;\r\nCenter Freq;13560000.000000;Hz\r\nFreq Offset;0.000000;Hz\r\nSpan;1000000.000000;Hz\r\nx-Axis;LIN;\r\nStart;13060000.000000;Hz\r\nStop;14060000.000000;Hz\r\nRef Level;-36.000000;dBm\r\nLevel Offset;0.000000;dB\r\nRef Position;100.000000;%\r\ny-Axis;LOG;\r\nLevel Range;100.000000;dB\r\nRf Att;10.000000;dB\r\nRBW;10000.000000;Hz\r\nVBW;30000.000000;Hz\r\nSWT;0.040000;s\r\nTrace Mode;CLR/WRITE;\r\nDetector;MAXPEAK;\r\nSweep Count;0;\r\nTrace 1:;;\r\nx-Unit;Hz;\r\ny-Unit;dBm;\r\nPreamplifier;NOT AVAILABLE;\r\nTransducer;OFF;\r\nValues;625;\r\n13060000;-101.74840545654297;\r\n13061602.564102564;-102.10520935058594;\r\n13063205.128205128;-105.79591369628906;\r\n13064807.692307692;-111.44921875;\r\n13066410.256410256;-106.73763275146484;\r\n13068012.82051282;-105.97975158691406;\r\n13069615.384615384;-103.39719390869.... 

但是當我運行這段代碼,我得到了一個錯誤信息說

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 243: ordinal not in range(128)

所以我覺得這個問題是關於Python不使用UTF-8。我試圖把

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

上的源代碼頭,但這不是幫助。我做了一些研究,並且有人建議使用string.decode('utf-8'),但是由於我直接從pyvisa設備讀取,所以這對我不起作用。有人可以幫忙嗎?

TIA

附滿了回溯:

>>> import pyvisa 
>>> rm = pyvisa.ResourceManager() 
>>> rm.list_resources() 
('TCPIP0::178.168.48.147::inst0::INSTR', 'TCPIP0::178.168.48.21::inst0::INSTR', 'TCPIP0::178.168.48.30::inst0::INSTR', 'ASRL10::INSTR', 'GPIB0::5::INSTR', 'GPIB0::20::INSTR') 
>>> maturo = rm.open_resource('GPIB0::20::INSTR') 
>>> esu = rm.open_resource('GPIB0::20::INSTR') 
>>> esu.query("*IDN?") 
'Rohde&Schwarz,ESU-40,100348/040,4.73\n' 
>>> esu.write("mmem:del \'traceData.DAT\'") 
(26, <StatusCode.success: 0>) 
>>> esu.write("mmem:cdir \'D:\'") 
(16, <StatusCode.success: 0>) 
>>> esu.write("hcop:dev:lang DAT") 
(19, <StatusCode.success: 0>) 
>>> esu.write("hcop:dest \'mmem\'") 
(18, <StatusCode.success: 0>) 
>>> esu.write("mmem:stor:trac 1,\'traceData.DAT\'") 
(34, <StatusCode.success: 0>) 
>>> esu.write("mmem:data? \'traceData.DAT\'") 
(28, <StatusCode.success: 0>) 
>>> esu.read() 
Traceback (most recent call last): 
    File "<pyshell#12>", line 1, in <module> 
    esu.read() 
    File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\pyvisa\resources\messagebased.py", line 332, in read 
    message = self.read_raw().decode(enco) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 241: ordinal not in range(128) 
+0

您需要包含該異常的*完整回溯*,以便我們可以正確評估造成這種情況的原因。 –

+0

不,源代碼編碼是*不會成爲原因。這隻會影響字符串文字的解碼方式,而不會從別處讀取數據。 –

+0

@MartijnPieters感謝您的回覆。我現在把追蹤。但我認爲這不是很有幫助...... –

回答

2

你需要閱讀時指定的編碼。該MessageBasedResource.read() method需要一個encoding參數:

ng = self.receiver_visa.read(encoding='latin1') 

你要麼需要找出編碼儀器使用,使用MessageBasedResource.read_raw() method讀取二進制數據,而不是。

小心,使用錯誤的編解碼器可能導致Mojibake;特別是Latin-1將總是愉快地解碼任何二進制數據,但結果文本可能不易讀。

相關問題