从 Mac 上运行的 pyserial 打开串行端口时禁用 DTR



我有以下代码:

import sys,serial
ser = serial.Serial()
ser.baudrate=57600
ser.port = sys.argv[1]
ser.dsrdtr = True
ser.open();
ser.setDTR(level=False)               
print ser.readline()

问题是我的Arduino UNO收到DTR并重新启动,如何禁用它(在软件中)?我的 python 代码正在从 Mac mini 运行,并带有 USB 连接到我的 UNO。

(我完全知道这一点,但硬件对我来说不是一个选择)

我遇到了类似的问题,但有一段时间无法找到解决方案。看起来这在带有一些黑客行为的 Windows 上是可能的,但问题在于 posix 的更深层次。

理想情况下,您应该能够在打开连接之前设置 DTR。喜欢这个:

import sys,serial
ser = serial.Serial()
ser.baudrate=57600
ser.port = sys.argv[1]
ser.dsrdtr = True
ser.setDTR(level=False)
ser.open();
print ser.readline()

但这在 serialposix.py 中抛出了一个portNotOpenError:

def setDTR(self,on=1):
    """set terminal status line"""
    if not self.fd: raise portNotOpenError
    if on:
        fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_DTR_str)
    else:
        fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_DTR_str)

我深入研究了 serialposix.py,您将看到根本问题所在。上面定义的self.fd实际上是:

self.fd = os.open(self.portstr, os.O_RDWR|os.O_NOCTTY|os.O_NONBLOCK)

如果您编写一个小脚本来使用 os.open(device, flags) 打开设备,您将看到它重置,即使您使用标志以只读方式打开它 os.O_RDONLY .

深入挖掘 os.open 标志的含义 - 我们发现 open 命令实际上包装了 unix 命令 open(2)。手册页在这里。

如果您找到更令人满意的解决方案,请告诉我。

最新更新