4

我正在使用 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()
4

1 回答 1

2

您不能忽略这些信号,特别是如果您使用基于硬件的流量控制。我假设您至少必须在两个端口之间链接以下信号,除了 RX(read) 和 TX(write)

CTS -> RTS
DSR -> DTR

关于您的代码的评论:

  1. 您定义了一个超时,这意味着 IO 功能将阻塞(即使它只是很短的时间)。考虑将其设置为 0

  2. 您调用 read 没有参数。这只会读取一个字节。您有什么理由不想一次阅读更多内容?会减少开销。

  3. 考虑添加一个条件来退出 while 循环。目前代码将一直运行,直到 pyserial 抛出异常。

于 2011-10-17T14:13:59.410 回答