【发布时间】:2011-10-18 14:42:46
【问题描述】:
我正在使用 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()
我对什么信号感兴趣?
编辑:
当我为每个端口轮询这些值时:
getCTS()、getDSR()、getRI()、getCD()
我得到: 真,假,假,真 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()
【问题讨论】:
-
一些串行设备需要一个空调制解调器适配器(我使用的电源只有在使用空调制解调器电缆时才能工作)您检查了吗?
-
是的,硬件设置是正确的,因为当我使用 C 应用程序代替我的 python 脚本时,我的设置工作正常。我的脚本中似乎遗漏了一些东西。
-
为什么会有VCOM3? VCOM2 和 VCOM3 如何连接?我希望硬件 COM1 脚本 VCOM2 模拟器
-
我使用虚拟串行端口模拟器在这两者之间创建了一对。
标签: python serial-port pyserial