2017-05-12 14 views
0

pyvisaを使用して、いくつかの楽器と話すことができます。UnicodeDecodeError: 'ascii'コーデックは、pyvisaデバイスから読み込まれた文字列をデコードできません。

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

書き込み部分が実際にそのデータを読み取るために、読み取りを()を使用して、その後、どこのデータを見つけるために楽器を教えて、それはそれを見つけるためにのために2秒待ってから、することです:私はこのようなコードを持っています。データは次のようになります。

'#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)

はので、私は問題がUTF-8を使用していないのpythonについてだと思うというエラーメッセージが表示されました。私は入れようとしました

#!/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_raw() methodを使用して、楽器をコードする使用するかを把握する必要がありますいずれか

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

MessageBasedResource.read() methodencodingパラメータを取ります。

気をつけて間違ったコーデックを使用すると、Mojibakeにつながる可能性があります。 Latin-1は、特にバイナリデータを常にうまくデコードしますが、結果のテキストは読みにくい場合があります。

関連する問題