我正在尝试使用pyserial将数据发送给arduino。但是当我打开COM端口时,它会将DTR设置得很低,并重新设置板。然而,我有我的arduino代码设置,所以我必须将它放入串行接收模式,按住两个按钮1秒。如果可能的话,我宁愿不必在引导arduino时进行串行输入。
显然,您可以修改序列化的Win32.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和重置之间放置了一个电阻器。然后,在软件中:
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欧姆电阻和复位引脚上投5V,防止DTR拉低它并重置芯片:)当我离开串行模式时,我只调用setResetDisable(false),这样芯片就可以正常编程了。
发布于 2013-03-18 14:21:17
您应该能够在打开端口之前禁用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修订版445 (请参阅http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyserial/serial/serialwin32.py?view=log)中的一个bug,并有评论:
允许setRTS,setDTR在打开Win32之前(设置初始状态),文档更新
看起来它可能刚刚错过了2.6版(上传于2011年11月2日,见:https://pypi.python.org/pypi/pyserial)。
此外,查看当前POSIX的setDTR()实现(在serialposix.py中),看起来好像这个bug不是修复的,如果端口不打开就会引发异常,因此跨平台解决方案看起来不太可能。
发布于 2017-08-03 04:49:05
禁用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()我找到它了这里。
发布于 2013-03-18 13:37:26
您描述的方法似乎是解决这个问题的最常见的方法,所以我怀疑没有更简单的基于软件的解决方案。当然,您可以使用ser.setDTR(level)手动更改DTR行的状态--但是,在Arduino自动重置的情况下,我还没有具体地尝试过这一点,而且我怀疑,即使在打开串行端口之后立即切换行也可能不够快,无法阻止重置。
我可以看到,您可以使用的其他选项是防止硬件中的Arduino (请看这里)的自动重置,或者稍微更改代码,以便在最初进行串行连接后允许Arduino重新启动,然后当您手动触发串行接收模式时,从Arduino发送一个初始信号,以显示它现在已经准备好接收数据。或者,您也可以在脚本中包含pySerial库的修改版本。
https://stackoverflow.com/questions/15460865
复制相似问题