Python读写tty

 火鸟大叔 发布于 2023-02-06 20:00

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

我正在研究测试设备的前端.前端的目的是使编写长测试脚本更容易.几乎只是让它们更具人性化和可写性.

该设备将使用Prologix GPIB-USB控制器进行测试(参见prologix.biz).我们在http://heliosoph.mit-links.info/gpib-on-debian-linux-the-easy-way/找到了一个教程,并完成了所有步骤,并且它有效!

由于我们还没有测试设备,我们想用openpty在Python中编写一个模拟器.我们确实有GPIB-USB控制器,而不是那些连接到它的东西.我让仿真器成为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

1 个回答
  • 好吧,我太早问了.我希望有人能从这个自我答案中受益.

    因此,这适用于从仿真器和实际设备读取和写入.我不确定为什么,并希望得到解释,但这在我的所有测试中都有效

    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()
    

    2023-02-06 20:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有