首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从代码中禁用pyserial中的DTR

从代码中禁用pyserial中的DTR
EN

Stack Overflow用户
提问于 2013-03-17 12:48:19
回答 5查看 19.6K关注 0票数 15

我正在尝试使用pyserial将数据发送给arduino。但是当我打开COM端口时,它会将DTR设置得很低,并重新设置板。然而,我有我的arduino代码设置,所以我必须将它放入串行接收模式,按住两个按钮1秒。如果可能的话,我宁愿不必在引导arduino时进行串行输入。

显然,您可以修改序列化的Win32.py文件,更改如下行:

代码语言:javascript
运行
复制
self._dtrState = win32.DTR_CONTROL_ENABLE

至:

代码语言:javascript
运行
复制
self._dtrState = win32.DTR_CONTROL_DISABLE

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

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

代码语言:javascript
运行
复制
 com = serial.Serial(port, baud, timeout=1);

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

许多帖子说你可以通过在5V和复位之间放置一个~100欧姆电阻来禁用DTR复位。但我不希望这是一件永久的事。所以,我在PD5和重置之间放置了一个电阻器。然后,在软件中:

代码语言:javascript
运行
复制
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),这样芯片就可以正常编程了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-18 14:21:17

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

代码语言:javascript
运行
复制
com = serial.Serial()
com.port = port
com.baudrate = baud
com.timeout = 1
com.setDTR(False)
com.open()

但是,在Windows上当前的pyserial (2.6)发行版上这样做会引发以下异常:

代码语言:javascript
运行
复制
..., 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不是修复的,如果端口不打开就会引发异常,因此跨平台解决方案看起来不太可能。

票数 15
EN

Stack Overflow用户

发布于 2017-08-03 04:49:05

禁用DTR对我不起作用:

ser.dtr = None

(Linux 4.4.0 x86_64 / Python 2.7.12 / PySerial 3.4)

但这样做是可行的:

代码语言:javascript
运行
复制
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()

我找到它了这里

票数 6
EN

Stack Overflow用户

发布于 2013-03-18 13:37:26

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15460865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档