我正在尝试将数据从 Keysight 示波器转换为
.png
图像。
当我在网上查看如何做到这一点时,我偶然发现了以下代码:
# Download the screen image.
# --------------------------------------------------------
sDisplay = do_query_ieee_block(":DISPlay:DATA? PNG")
# Save display data values to file.
f = open("screen_image.png", "wb")
f.write(sDisplay)
f.close()
上面代码的问题是我不确定
do_query_ieee_block
是什么。我以为它在pyvisa
下,但在那里找不到。网上查了一下,我明白 query_binary_values
与 pyvisa
或多或少是一样的,假设数据在 IEEE
中。
根据这些信息,我编写了以下代码:
import pyvisa
import struct
IDN="SomeScopeIDN" #something like 'USB0::0xhhhh::0xhhhh::MYdddddddd::0::INSTR'
scope=pyvisa.ResourceManager().open_resource(IDN)
binImage=self.scope.query_binary_values(":DISPlay:DATA? PNG") #This gets a list of floats
byteImage=struct.pack('%sf' % len(binImage),*binImage) #Convert the list to bytes-like object
path=r"c:\Users\user\Desktop\Scope_Image.png"
with open (path,'wb') as f:
f.write(byteImage)
这创建了一个图像,但结果很糟糕:
以及来自截图工具:
如您所见,只有图像的上 10% 是好的,但其余部分则不好(需要提到的是,每次我从示波器中检索新数据时,我都会得到一个损坏的不同区域,该区域在 50-图片的 90%。大多数时候损坏区域在 80-90% 之间,如上图所示)。
所以基本上我的问题是:
难道是我没有读取仪器的全部数据?如果是这样,如何克服这个问题?
会不会是因为包装错误造成的?如果是的话,解决办法是什么?
看到一个可能有用的例子:
将
datatype='B', container=bytearray
添加为 query_binary_values()
的参数
交替尝试
':DISP:DATA? ON,OFF,PNG'
import pyvisa
IDN="SomeScopeIDN" #something like 'USB0::0xhhhh::0xhhhh::MYdddddddd::0::INSTR'
scope=pyvisa.ResourceManager().open_resource(IDN)
binImage=self.scope.query_binary_values(":DISPlay:DATA? PNG", datatype='B', container=bytearray)
path=r"c:\Users\user\Desktop\Scope_Image.png"
with open (path,'wb') as f:
f.write(byteImage)
这可能来得太晚了,但我不久前使用 query_binary_values() 遇到了类似的问题,只是我尝试读回 ARB 波形而不是 png。我找到的解决方案与我的数据的字节顺序有关。查看 is_big_endian 参数,看看这是否会导致问题。我还会研究 header_fmt、delay 和 chunk_size 参数。 https://pyvisa.readthedocs.io/en/latest/api/resources.html#pyvisa.resources.MessageBasedResource.query_binary_values