从cod禁用pyserial中的DTR

2024-05-15 23:09:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用pyserial把数据发送给一个arduino。但当我打开COM端口时,它会将DTR设置为低并重置板。但是,我有我的arduino代码设置,因此我必须将其置于串行接收模式,按住两个按钮1秒。如果可能的话,我宁愿不用在arduino的引导下进行串行输入。

显然,您可以修改serialWin32.py文件,更改如下行:

self._dtrState = win32.DTR_CONTROL_ENABLE

致:

self._dtrState = win32.DTR_CONTROL_DISABLE

但是,有没有办法直接在我的python脚本中禁用它呢?我还需要对所有系统都这样做。我不想强迫人们仅仅为了使用这个脚本而改变他们的基本串行配置。

串行端口按如下方式打开:

 com = serial.Serial(port, baud, timeout=1);

更新:最后,我找到了一个适合我的设置的解决方案。由于我不需要一直做串行数据,只有当我把设备设置为串行接收模式时,我才找到一种方法,从arduino本身禁用串行连接重置。

很多贴子都说你可以通过在5V和复位之间放置一个约100欧姆的电阻来禁用DTR复位。但我不想让这成为永久的事情。所以,我把一个电阻放在PD5和reset之间。然后,在软件中:

void setup() {
    //.......
    DDRD &= ~(_BV(PD5)); //Set PD5 as input initially
    PORTD |= (_BV(PD5)); //Set high
    //.......
}

inline void setResetDisable(bool state)
{
  if(state)
    DDRD |= (_BV(PD5)); //Set PD5 as output to put 5V on reset line
  else
    DDRD &= ~(_BV(PD5)); //set back to input mode
}

所以现在,当我想进入串行模式时,我调用setResetDisable(true),它向100欧姆电阻和复位引脚抛出5伏电压,防止DTR拉低它并复位芯片:) 然后,当我离开串行模式时,我只调用setResetDisable(false),这样芯片就可以正常编程。


Tags: 数据端口self模式arduinocontrol重置win32
3条回答

你所描述的方法似乎是我见过的解决这个问题的最常见的方法,所以我怀疑没有更简单的基于软件的解决方案。当然,您可以使用ser.setDTR(level)手动更改DTR线路的状态-但是我还没有在Arduino自动重置的情况下特别尝试过,而且我怀疑即使在打开串行端口后立即切换线路也可能不够快,无法阻止重置。

我可以看到您可以使用的其他选项是防止在硬件中自动重置Arduino(see here),或者稍微更改代码,以便在最初建立串行连接后允许Arduino重新启动,然后当您手动触发串行接收模式时,从Arduino发送一个初始信号,显示它现在已经准备好接收数据。或者,可以在脚本中包含pySerial库的修改版本。

禁用DTR对我不起作用:
ser.dtr = None
(Linux 4.4.0 x86_64 / Python 2.7.12 / PySerial 3.4)

但这是有效的:

import serial
import termios

port = '/dev/ttyACM0'
f = open(port)
attrs = termios.tcgetattr(f)
attrs[2] = attrs[2] & ~termios.HUPCL
termios.tcsetattr(f, termios.TCSAFLUSH, attrs)
f.close()
se = serial.Serial()
se.baudrate = 115200
se.port = port
print 'dtr =', se.dtr
se.open()

我找到它了。

您应该能够在打开端口之前禁用DTR,如下所示:

com = serial.Serial()
com.port = port
com.baudrate = baud
com.timeout = 1
com.setDTR(False)
com.open()

但是,在Windows上的pyserial(2.6)的当前版本上执行此操作会引发以下异常:

..., line 315, in setDTR
ValueError: Attempting to use a port that is already open

这似乎是一个在2011年12月29日最新版本的源代码SVN revision 445(见http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyserial/serial/serialwin32.py?view=log)中修复的错误,注释如下:

allow setRTS, setDTR before opening on Win32 (to set initial state), doc update

看起来它可能刚刚错过了2.6版本(2011年11月2日上传见:https://pypi.python.org/pypi/pyserial)。

此外,查看POSIX的setDTR()(在serialposix.py中)的当前实现,似乎此错误未被修复,如果端口未打开,则会引发异常,因此跨平台解决方案看起来不太可能。

相关问题 更多 >