【问题标题】:Python reading and writing to ttyPython 读写 tty
【发布时间】:2014-01-03 01:24:26
【问题描述】:

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

我正在开发测试设备的前端。前端的目的是让编写长测试脚本更容易。几乎只是让它们更具人类可读性和可写性。

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

由于我们还没有测试设备,我们想用 Python 编写一个使用 openpty 的模拟器。我们确实有 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

【问题讨论】:

    标签: python linux bash tty pty


    【解决方案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()
    

    【讨论】:

    • 您能否说明您使用的是哪个serial.Serial(缺少导入?)
    • 我编辑了它。警惕!!这是 3 年前的事情,所以我可能错了,但我只是猜测 python -c "import serial; print serial.Serial" 有效
    • 谢谢,我只是在寻找一种解决方案,它可以让我与一个蓝牙连接到设备的 tty 通话。 - 我不认为serial 是标准的python 库吗?也许是pySerial?有几件事没有意义,但我会继续努力;)
    • 使用 pySerial 并删除 self.setAddress(0) 行,这非常适合我(不可否认的 hacky)脚本在 2017 年基于 Mavericks 的 Mac 上与蓝牙通信。感谢您的快速响应! `
    【解决方案2】:

    您实际上不必使用任何特殊模块来读取 TTY。
    选项 O_NOCTTY 解决了我使用 CDCACM 示例 MCU 应用程序的问题。
    我相信它对你有用(就像你在 Linux 上工作一样)。

    #!/usr/bin/env python3
    
    import io, os
    
    tty = io.TextIOWrapper(
            io.FileIO(
                os.open(
                    "/dev/ttyACM1",
                    os.O_NOCTTY | os.O_RDWR),
                "r+"))
    
    for line in iter(tty.readline, None):
        print(line.strip())
    

    【讨论】:

      猜你喜欢
      • 2011-08-19
      • 2023-03-20
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      相关资源
      最近更新 更多