从 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 打开并将数据发送到本地计算机上的串行端口吗?