无源串口监视器

时间:2011-10-17 13:33:34

标签: python serial-port pyserial

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

1 个答案:

答案 0 :(得分:1)

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

CTS -> RTS
DSR -> DTR

关于您的代码的评论:

  1. 您定义了超时,这意味着IO功能将被阻止(即使它仅在很短的时间内)。考虑将其设置为0

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

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