我正在创建一个使用twisted的python应用程序,它从串行端口读取行。 为了(单元)测试该应用程序而不必将实际设备连接到串行端口(也在没有实际串行端口的PC上)我想创建一个设置虚拟串行端口并写入的python脚本/应用程序它,所以扭曲的应用程序可以连接到虚拟串行端口的另一端并从中读取。这样我就可以编写一些单元测试。
我发现这可以在linux中使用伪终端。我还在https://askubuntu.com/questions/9396/virtual-serial-port-for-testing-purpose上找到了一个工作示例脚本。
我想将该脚本更改为一个类,我可以在其上调用write方法将数据写入串口,然后测试扭曲的应用程序。
这个示例脚本使用poll和select以及我不太了解的linux stty命令执行了很多操作。我希望有人可以填补我的知识空白或提供一些提示。
干杯,
Dolf。
答案 0 :(得分:3)
除了Jean-Paul Calderone所说的(主要是正确答案)之外,我还使用socat在python中制作了以下脚本。
这可以导入并实例化为解释器,然后您可以使用它的writeLine方法将数据写入(vritual)串行端口,该端口通过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()
答案 1 :(得分:2)
您不需要pty来测试您的协议。你甚至不需要任何文件描述符。请遵循http://twistedmatrix.com/documents/current/core/howto/trial.html中的指南,尤其是测试协议部分。
答案 2 :(得分:0)
更好的方法可能是使用软件零调制解调器模拟器。
您可以从github获取Linux版本,从sourceforge获取Windows版本。
在linux上,它被称为tty0tty,你只需输入
即可请
构建一切。然后你需要输入
sudo insmod module / 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)