背景:如果需要,请跳至问题部分

我正在测试设备的前端。前端的目的是使编写长测试脚本变得更加容易。几乎只是使它们更具可读性和可写性。

将使用Prologix GPIB-USB Controller 对设备进行测试(请参阅prologix.biz)。我们在http://heliosoph.mit-links.info/gpib-on-debian-linux-the-easy-way/中找到了一个教程,并完成了所有步骤,并且成功了!

由于我们还没有测试设备,因此我们想使用openpty用Python编写一个仿真器。我们确实有GPIB-USB Controller ,但没有与之相连的 Controller 。我让仿真器可以完美替代GPIB-USB。这意味着我将按照上面的“Debian ...上的GPIB ...”教程进行操作,并获得对模拟器进行编程以返回的输出。输入和输出以与教程相同的方式完成,只是在pty设备(即/dev/pts/2)而不是tty(即/dev/ttyUSB0)中读写。

既然模拟器可以正常工作了,我们想编写一个可以轻松编写脚本的前端。目的是要创建一种宏系统,当我们调用一个函数时,它会编写一堆命令。

问题:同时存在于仿真器和设备中

我正在使用以下Python函数来读取,写入和打开tty/pty设备,但是如果仅在bash中使用echo和cat,则不会获得相同的结果。

tty = os.open(tty_path, os.O_RDWR)
os.read(tty, 100)
os.write(tty, "++ver")

例如,我希望以下内容是等效的
$ cat < /dev/pty/2 &   # According to the tutorial, this must be run in parallel
$ echo "++ver" > /dev/pty/2
Prologix GPIB Version 1.2.3.4 ...


tty = os.open("/dev/pyt/2", os.o_RDWR)
os.read(tty, 100) # In separate Thread to be run in parallel
os.write(tty, "++ver") # in main thread

输出结果非常不同,请解释为什么以及如何解决它。

完整的代码在这里:http://pastebin.com/PWVsMjD7

最佳答案

好吧,我问得太早了。我希望有人从这个自我回答中受益。

因此,这可以从仿真器和实际设备读取和写入。我不确定原因,也希望能得到解释,但这确实适用于我所有的测试

import serial

class VISA:
    def __init__(self, tty_name):
        self.ser = serial.Serial()
        self.ser.port = tty_name
        # If it breaks try the below
        #self.serConf() # Uncomment lines here till it works

        self.ser.open()
        self.ser.flushInput()
        self.ser.flushOutput()

        self.addr = None
        self.setAddress(0)

    def cmd(self, cmd_str):
        self.ser.write(cmd_str + "\n")
        sleep(0.5)
        return self.ser.readline()

    def serConf(self):
        self.ser.baudrate = 9600
        self.ser.bytesize = serial.EIGHTBITS
        self.ser.parity = serial.PARITY_NONE
        self.ser.stopbits = serial.STOPBITS_ONE
        self.ser.timeout = 0 # Non-Block reading
        self.ser.xonxoff = False # Disable Software Flow Control
        self.ser.rtscts = False # Disable (RTS/CTS) flow Control
        self.ser.dsrdtr = False # Disable (DSR/DTR) flow Control
        self.ser.writeTimeout = 2

    def close(self):
        self.ser.close()

关于Python对tty的读写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20894969/

10-09 08:42