【问题标题】:Passive Serial Port Monitor被动串口监视器
【发布时间】: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


【解决方案1】:

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

CTS -> RTS
DSR -> DTR

对您的代码的评论:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多