我有以下代码:
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代码是从带有usb连接的Mac mini运行到我的UNO。
(我完全了解this,但硬件不适合我)
答案 0 :(得分:0)
我遇到了类似的问题,但暂时还没有找到解决方案。看起来这可以在Windows with some hackery上实现,但问题在于posix。
理想情况下,您应该能够在打开连接之前设置Dig。像这样:
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命令打开(2)。手册页为here。
如果您找到更满意的解决方案,请告诉我。