首页 > 解决方案 > 如何仅通过 pySerial 在端口打开而不是端口关闭时发送 DTR/RTS 信号

问题描述

我有一个系统,当它的 COM 端口通过 pySerial 打开或关闭时,会在两者上接收复位信号,这是标称行为:

with Serial("COM4", 19200) as ser:
    ser.write(bytearray[89])

然而,我想要发生的是重置仅在端口打开时发生,并允许系统在端口关闭时继续运行。

我的失败尝试:

ser = serial_for_url("COM4", 19200, do_not_open=True)
ser.dtr = 0
ser.rts = 0
ser.open()

ser.write(bytearray[89])

ser.dtr = 1
ser.rts = 1
ser.close()

这可能吗?还是posix端口的性质使得它们的行为在实例化时是固定的?

谢谢!

标签: pythonserial-portpyserial

解决方案


它们是否可以完成取决于操作系统和设备驱动程序。
那么 , 的设定值将是rts,而不是, 。 dtrTrueFalse10

pySerial API

open()
打开端口。rts和的状态dtr被应用。

某些操作系统和/或驱动程序可能会在端口打开后自动激活 RTS 和/或 DTR。RTS/DTR 可能会在设置rtsdtr设置与默认值(True/活动)不同时出现故障。

出于兼容性原因,由于 EINVAL (22) 或 ENOTTY (25) 在 POSIX 上应用rts或失败时不会报告错误。dtr

rts
Setter:设置 RTS 行的状态
Getter:返回 RTS 行的状态
类型: bool

将 RTS 线设置为指定的逻辑电平。可以在打开串行端口之前分配此值,然后应用该值open()(有限制,请参阅open())。

dtr
Setter:设置 DTR 行的状态
Getter:返回 DTR 行的状态
类型: bool

将 DTR 线设置为指定的逻辑电平。可以在打开串行端口之前分配此值,然后应用该值open()(有限制,请参阅open())。


如果您的系统支持这些功能,您的程序可以进行如下修改吗​​?
请试一试。

ser = serial_for_url("COM4", 19200, do_not_open=True)
ser.dtr = False
ser.rts = False
ser.open()
time.sleep(0.1) # The time required for the device to recognize the reset condition.
ser.dtr = True
ser.rts = True
time.sleep(2.0) # The time required for the device to complete the reset operation.

ser.write(bytearray[89])

ser.flush() # wait until all data is written.
ser.close()

推荐阅读