【问题标题】:How to only send DTR/RTS signal on port open but not port close via pySerial如何仅通过 pySerial 在端口打开而不是端口关闭时发送 DTR/RTS 信号
【发布时间】:2020-06-11 00:45:48
【问题描述】:

我有一个系统,当它的 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 端口的性质使得它们的行为在实例化时是固定的?

谢谢!

【问题讨论】:

    标签: python serial-port pyserial


    【解决方案1】:

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

    pySerial API

    open()
    打开端口。应用rtsdtr 的状态。

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

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

    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()
    

    【讨论】:

    • 不幸的是,我看到 pin 状态完全没有变化。
    • 例如,尝试使用 Python 以外的其他语言,例如 C。如果不起作用,则可能是操作系统或驱动程序问题。
    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 2021-06-18
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多