被动串口监视器

4 投票
1 回答
4037 浏览
提问于 2025-04-17 04:28

我正在使用pyserial来打开两个端口,然后把从一个端口读取到的数据写入另一个端口。我有一个物理的串口连接到其中一个端口,还有一个虚拟串口连接到另一个。这个虚拟串口又连接到第二个虚拟串口,而我的模拟器就是连接到这个第二个虚拟串口上:

Hardware device <> COM1 <> Python Script <> VCOM2 <> VCOM3 <> Simulator

我可以看到在我的脚本中,数据在串口之间的进出是正常的,但似乎有什么地方不对,因为硬件和模拟器之间的通信不太正常。

我有一个旧的C语言应用程序,可以代替这个Python脚本运行,而且运行得很好。不过,这个程序写得很糟糕,我也不想去修复它的所有bug。所以我希望能用Python脚本来替代这个应用程序。最终我想记录通过这些端口传输的数据,并加上时间戳。

我在两个情况下都使用了正确的波特率,但我似乎漏掉了什么。我是否应该在每个端口之间传输一些信号,比如DTR?pyserial有这些功能:

sendBreak(duration=0.25)
setBreak(level=True)
setRTS(level=True)
setDTR(level=True)
getCTS()
getDSR()
getRI()
getCD()

我应该关注哪些信号呢?

编辑:

当我查询每个端口的这些值时:

getCTS(), getDSR(), getRI(), getCD()

我得到的结果是:

True, False, False, True COM1

False, False, False, False VCOM2

不过,我发现CD有时候会变成false。我该如何通过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 个回答

2

你不能忽视信号,特别是当你使用硬件基础的流控制时。我假设除了接收信号(RX)和发送信号(TX),你至少还需要在两个端口之间连接以下信号。

CTS -> RTS
DSR -> DTR

关于你代码的几点建议:

  1. 你定义了一个超时时间,这意味着输入输出功能会被阻塞(即使只是短暂的时间)。可以考虑把它设置为0。

  2. 你调用了没有参数的读取函数。这只会读取一个字节。你有没有什么特别的原因不想一次读取更多的数据?这样可以减少开销。

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

撰写回答