首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python - pyvisa -尝试从没有读取_termination的设备读取可变长度数据

python - pyvisa -尝试从没有读取_termination的设备读取可变长度数据
EN

Stack Overflow用户
提问于 2020-10-01 12:41:24
回答 2查看 68关注 0票数 1

我可以使用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

任何指向正确方向的指针都会有所帮助。这是一种非常奇怪的设备。我尝试过的大多数东西都以“设备正在使用”或“超时”错误结束。

提前谢谢你。

罗宾

EN

回答 2

Stack Overflow用户

发布于 2020-10-04 11:10:04

下面的read_data()函数在一定程度上解决了这个问题。现在来找出背靠背写入失败的原因,除非在两次写入之间没有使用大约.2秒的time.sleep(x)。

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2022-03-01 10:56:34

我在测量仪器上也遇到了同样的问题,花了一段时间才找到解决方案:

device.bytes_in_buffer给出了缓冲区内的字节数和

answer = device.read_bytes( device.bytes_in_buffer )返回缓冲区内的字节数。

之后,您可以调用answer.decode()来获取设备返回给您的ASCII字符串。下面是我写的一个Python类的更长的例子,以使与设备的通信变得更容易:

代码语言:javascript
复制
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]
        ))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64149175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档