2

我有以下代码:

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 连接到我的 UNO 的 Mac mini 上运行的。

(我完全意识到这一点,但硬件不是我的选择)

4

1 回答 1

0

我也有类似的问题,但有一段时间没能找到解决方案。看起来这在带有一些hackery的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)。手册页在这里

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

于 2014-03-27T01:44:44.283 回答