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

Posted

技术标签:

【中文标题】从 Mac 上运行的 pyserial 打开串行端口时禁用 DTR【英文标题】:Disable DTR when opening the serial port from pyserial running on a Mac 【发布时间】:2013-11-11 08:51:57 【问题描述】:

我有以下代码:

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。

(我完全了解this,但硬件不是我的选择)

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,但有一段时间没能找到解决方案。看起来这在 Windows with some hackery 上是可能的,但问题在于 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 以只读方式打开它。

深入研究meaning of the os.open flags- 我们发现open 命令实际上包装了unix 命令open(2)。手册页是here。

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

【讨论】:

以上是关于从 Mac 上运行的 pyserial 打开串行端口时禁用 DTR的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 python 和 pyserial 打开 /dev/ttyusb0

可以在网站上使用 pySerial 打开并将数据发送到本地计算机上的串行端口吗?

Python PySerial,如何打开串口?

重启后Pyserial的串行连接问题

重新打开后,arduino 和 pyserial 之间的串行连接变慢

从 Pyserial 读取串行输出不能可靠地工作