我可以使用miniterm.py对信号发生器进行读写。流中没有read_termination字符(根据设备制造商的手册)。我已经附加了miniterm的调试输出,以显示一些事务。让pyvisa读取任意长度的返回字符串而不终止是否遗漏了什么?
设置: /dev/ttyUSB0 9600,8,N,1 RTS:活动DTR:活动中断:非活动CTS:非活动DSR:非活动RI:非活动CD:非活动软件流程控制:非活动硬件流程控制:非活动串行输入编码: UTF-8串行输出编码: UTF-8 EOL: LF筛选器: debug default direct
TX:'R‘TX:'W’RX:'3‘3 RX:'6’6 TX:'R‘TX:'W’RX:'0‘0 TX:'R’TX:'A‘RX:'2’2 RX:'0‘0 RX:'0’0 TX:'R‘TX:'A’RX:'1‘1 RX:'0’0 RX:'0‘0 RX:'0’0
任何指向正确方向的指针都会有所帮助。这是一种非常奇怪的设备。我尝试过的大多数东西都以“设备正在使用”或“超时”错误结束。
提前谢谢你。
罗宾
发布于 2020-10-04 11:10:04
下面的read_data()函数在一定程度上解决了这个问题。现在来找出背靠背写入失败的原因,除非在两次写入之间没有使用大约.2秒的time.sleep(x)。
def read_data(cmd):
data=""
byte=""
looper = True
dds.write(cmd)
while(looper==True):
try:
byte = dds.read_bytes(1)
data += byte.decode()
except:
looper = False
return(data)发布于 2022-03-01 10:56:34
我在测量仪器上也遇到了同样的问题,花了一段时间才找到解决方案:
device.bytes_in_buffer给出了缓冲区内的字节数和
answer = device.read_bytes( device.bytes_in_buffer )返回缓冲区内的字节数。
之后,您可以调用answer.decode()来获取设备返回给您的ASCII字符串。下面是我写的一个Python类的更长的例子,以使与设备的通信变得更容易:
import pyvisa as visa
import logging as log
import time
from typing import Final, Union
class interface: # provide write(), read(), read_raw(), ask() and ask_raw() function
_device = None
def __init__(self, device) -> None:
self._device = device
def write(self, command) -> None:
self._device.write("%s" % ( command))
def read(self) -> str:
return self.read_raw().decode()
def read_raw(self) -> str:
return self._device.read_bytes( self._device.bytes_in_buffer )
def ask(self, command) -> str:
return self.ask_raw(command).decode()
# flush buffer, this is necessary to prevent from errors because the last SCPI command took to long to be received
def flush_buffer(self) -> None:
self._device.flush(visa.constants.VI_READ_BUF)
def ask_raw(self, command) -> str:
self.flush_buffer()
self.write(command)
time.sleep(0.2) # this is needed for the device to process the SCPI command
return self.read_raw()
def boolean_property(
self,
scpi_cmd: str, # command name of scpi option
err_description: str, # generate usefull error messages
value: Union[bool, None] = None # True or False -> set scpi option to value, None -> get current value of scpi option
) -> Union[bool, None]:
# if parameter value is None -> get current state from scpi option
if value == None:
return {
"ON": True,
"1": True,
"OFF": False,
"0": False
}[str(
self.ask("%s?" % (scpi_cmd.upper()))
).upper()] # uppercase conversion is used to prevent issues with unexpected lowercase letters
# check wether the parameter is a boolean
if not type(value) == bool:
return log.error("%s: Cannot assign \"%s\" for %s, must be bool(True) or bool(False)" % (self._device, value, err_description))
# write the scpi command
self.write("%s %s" % (
scpi_cmd,
{
True: "ON",
False: "OFF"
}[value]
))https://stackoverflow.com/questions/64149175
复制相似问题