【问题标题】:How can I use a pseudoterminal in python to emulate a serial port?如何在 python 中使用伪终端来模拟串口?
【发布时间】:2013-03-02 10:51:18
【问题描述】:

我正在使用从串行端口读取行的twisted 创建一个python 应用程序。 为了(单元)测试该应用程序而不必将实际设备连接到串行端口(也在没有实际串行端口的 pc 上)我想创建一个 python 脚本/应用程序来设置虚拟串行端口并写入它,所以扭曲的应用程序可以连接到虚拟串口的另一端并从中读取。这样我就可以写一些单元测试了。

我发现在 linux 中使用伪终端可以做到这一点。我还在https://askubuntu.com/questions/9396/virtual-serial-port-for-testing-purpose 上找到了一个工作示例脚本。

我想将该脚本更改为一个类,我可以在该类上调用 write 方法将数据写入串行端口,然后测试扭曲的应用程序。

这个示例脚本用 poll 和 select 以及一个我不太了解的 linux stty 命令做了很多事情。我希望有人可以填补我的知识空白或提供一些提示。

干杯,

道夫。

【问题讨论】:

  • 我找到了使用 socat 的解决方法。如果我在终端上发出socat PTY,link=$HOME/pty_in,raw,echo=0 PTY,link=$HOME/pty_out,我可以访问 ~/pty_in 和 ~/pyt_out 作为串行端口,例如使用 pyserial。但是,如果我可以在没有 socat 和普通 python 的情况下做到这一点,那就更好了。

标签: python linux twisted


【解决方案1】:

除了 Jean-Paul Calderone 所说的(大部分是正确答案)之外,我还使用 socat 在 python 中制作了以下脚本。

这可以导入并实例化到解释器中,然后你可以使用它的 writeLine 方法将数据写入(虚拟)串口,该串口通过 socat 连接到另一个(虚拟)串口,在该串口上另一个扭曲的应用程序可以听。但正如 Jean-Paul Calderone 所说:如果只是你想要的单元测试,你真的不需要做这些事情。只需阅读他提到的文档即可。

import os, subprocess, serial, time
from ConfigParser import SafeConfigParser


class SerialEmulator(object):
    def __init__(self,configfile):
        config=SafeConfigParser()
        config.readfp(open(configfile,'r'))
        self.inport=os.path.expanduser(config.get('virtualSerialPorts','inport'))
        self.outport=os.path.expanduser(config.get('virtualSerialPorts','outport'))
        cmd=['/usr/bin/socat','-d','-d','PTY,link=%s,raw,echo=1'%self.inport,'PTY,link=%s,raw,echo=1'%self.outport]
        self.proc=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        time.sleep(3)
        self.serial=serial.Serial(self.inport)
        self.err=''
        self.out=''
    def writeLine(self,line):
        line=line.strip('\r\n')
        self.serial.write('%s\r\n'%line)
    def __del__(self):
        self.stop()
    def stop(self):
        self.proc.kill()
        self.out,self.err=self.proc.communicate()

【讨论】:

  • 为了记录,除了twisted,这对于测试一些使用pyserial串行接口的代码确实非常有用。
【解决方案2】:

您不需要 pty 来测试您的协议。您甚至不需要任何类型的文件描述符。请遵循http://twistedmatrix.com/documents/current/core/howto/trial.html 的指南,尤其是测试协议部分。

【讨论】:

    【解决方案3】:

    更好的方法可能是使用软件空调制解调器模拟器。

    你可以从github 获得它,对于 linux 和从 sourceforge 对于 Windows。

    在 linux 上它被称为 tty0tty,你只需输入

    制作

    构建一切。然后你需要输入

    sudo insmod 模块/tty0tty.ko

    安装虚拟驱动和

    ./pts/tty0tty

    启动应用程序,它会打开 2 个虚拟端口:/dev/pts/4 和 /dev/pts/6。

    然后您可以在您的 python 单元测试中打开 /dev/pts/4 串行端口,并在您的应用程序中打开 /dev/pts/6。

    在您的 python 单元测试中,您只需键入如下内容:

    import serial 
    ser = serial.Serial('/dev/pts/4', 19200)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2011-12-18
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多