我正在创build一个使用双绞线从串口读取线路的Python应用程序。 为了(单位)testing该应用程序,而不必将实际设备连接到串行端口(也没有一个实际的串行端口的PC上)我想创build一个Python脚本/应用程序,build立一个虚拟的串行端口,并写所以扭曲的应用程序可以连接到虚拟串行端口的另一端并从中读取。 这样我可以写一些单位testing。
我发现这是可能的在Linux中使用伪terminal。 我还在https://askubuntu.com/questions/9396/virtual-serial-port-for-testing-purpose上find了一个可用的示例脚本。
我想改变这个脚本到一个类,我可以调用一个写入方法来写入数据到串口,然后testing扭曲的应用程序。
这个示例脚本用poll和select和一个linux stty命令做了很多工作,但是我不太明白。 我希望有人能填补我的知识空白或提供一些提示。
干杯,
Dolf。
你不需要一个pty来测试你的协议。 你甚至不需要任何类型的文件描述符。 请遵循http://twistedmatrix.com/documents/current/core/howto/trial.html上的指导原则,特别是测试协议部分。
除了让·保罗·卡尔德龙(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()
更好的方法可能是使用软件null调制解调器仿真器。
你可以从github for linux和从sourceforge for 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)