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

时间:2013-11-11 08:51:58

标签: python arduino pyserial

我有以下代码:

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,但硬件不适合我)

1 个答案:

答案 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

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