我试图找到解决方案,但仍坚持使用它。
我想用PyVisa来控制函数发生器。
我有一个waveform
,它是0
和16382
之间的值列表
然后我必须以每个waveform
点占用2个字节的方式准备它。
值以big-endian,MSB-first格式表示,并且是直接二进制。我做binwaveform = pack('>'+'h'*len(waveform), *waveform)
然后当我尝试用AFG.write('trace ememory, '+ header + binwaveform)
将其写入乐器时,我收到错误:
File ".\afg3000.py", line 97, in <module>
AFG.write('trace ememory, '+ header + binwaveform)
TypeError: Can't convert 'bytes' object to str implicitly
我试图用AFG.write('trace ememory, '+ header + binwaveform.decode())
来解决它,但它看起来默认情况下会尝试使用ASCII字符,这些字符对于某些值不正确:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 52787: invalid start byte
你能帮忙吗?
答案 0 :(得分:2)
binwaveform
是整数的压缩字节数组。 E.g:
struct.pack('<h', 4545)
b'\xc1\x11'
您无法打印它,因为它对您的终端没有意义。在上面的例子中,
0xC1
是无效的ASCII和UTF-8。
当你将一个字节字符串附加到常规str(trace ememory, '+ header + binwaveform
)时,Python希望将它转换为可读文本,但不知道如何。
解码它意味着它是文本 - 它不是。
最好的办法是打印它的十六进制表示:
import codecs
binwaveform_hex = codecs.encode(binwaveform, 'hex')
binwaveform_hex_str = str(binwaveform_hex)
AFG.write('trace ememory, '+ header + binwaveform_hex_str)