背景:如果需要,请跳至问题部分
我正在研究测试设备的前端。前端的目的是使编写长测试脚本更容易。几乎只是让它们更具人性化和可写性。
将使用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
答案 0 :(得分:7)
因此,这适用于从仿真器和实际设备读取和写入。我不确定为什么,并希望得到解释,但这在我的所有测试中都有效
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()
答案 1 :(得分: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())