我正在使用 pyserial 打开两个端口,然后将我从另一个端口读取的内容写入每个端口。然后我有一个连接到这些端口之一的物理 com 端口和一个连接到另一个的虚拟 com 端口。虚拟 com 端口又连接到我的模拟器所连接的第二个虚拟 com 端口:
Hardware device <> COM1 <> Python Script <> VCOM2 <> VCOM3 <> Simulator
我可以看到通信在我的脚本中正确地进入和退出了 com 端口,但是由于硬件无法与模拟器正确通信,因此出现了一些问题。
我有一个旧的 c 应用程序,可以代替 Python 脚本运行,并且可以正常工作。然而,它写得真的很糟糕,我对修复它的所有错误没有真正的兴趣。所以我希望我可以用 python 脚本替换这个应用程序。我最终希望用时间戳记录通过端口的数据。
在这两种情况下,我都使用了正确的波特率,但是我似乎遗漏了一些东西。我应该在每个端口(例如 DTR)之间传输信号吗?pyserial 具有以下功能:
sendBreak(duration=0.25)
setBreak(level=True)
setRTS(level=True)
setDTR(level=True)
getCTS()
getDSR()
getRI()
getCD()
我对什么信号感兴趣?
编辑:
当我为每个端口轮询这些值时:
获取CTS(),获取DSR(),获取RI(),获取CD()
我得到:真,假,假,真 COM1 假,假,假,假 VCOM2
但是,我看到 CD 有时会变成假的。如何通过 VCOM2 将其传输出去,或者我需要这样做吗?
编辑:
这是我的代码。一旦通信开始,脚本就会锁定,我需要重新启动计算机以释放端口。我无法在 Windows 7 上杀死相关的 python 进程...
import serial
class NewMonitor():
def __init__(self, com_port_1, com_port_2):
self.read_time_in_seconds = 0.1
self.serialPort1 = serial.Serial(com_port_1, 9600, timeout=self.read_time_in_seconds, rtscts=True, dsrdtr=True)
self.serialPort2 = serial.Serial(com_port_2, 9600, timeout=self.read_time_in_seconds, rtscts=True, dsrdtr=True)
try:
while True:
item = self.serialPort1.read()
self.serialPort2.write(item)
self.serialPort2.setRTS(self.serialPort1.getCTS())
self.serialPort2.setDTR(self.serialPort1.getDSR())
item = self.serialPort2.read()
self.serialPort1.write(item)
self.serialPort1.setRTS(self.serialPort2.getCTS())
self.serialPort1.setDTR(self.serialPort2.getDSR())
finally:
self.serialPort1.close()
self.serialPort2.close()