我有以下代码:
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)。手册页在这里。
如果您找到更令人满意的解决方案,请告诉我。