我想用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),这样芯片就可以正常编程。
你所描述的方法似乎是我见过的解决这个问题的最常见的方法,所以我怀疑没有更简单的基于软件的解决方案。当然,您可以使用
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)
但这是有效的:
我找到它了。
您应该能够在打开端口之前禁用DTR,如下所示:
但是,在Windows上的pyserial(2.6)的当前版本上执行此操作会引发以下异常:
这似乎是一个在2011年12月29日最新版本的源代码SVN revision 445(见http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyserial/serial/serialwin32.py?view=log)中修复的错误,注释如下:
看起来它可能刚刚错过了2.6版本(2011年11月2日上传见:https://pypi.python.org/pypi/pyserial)。
此外,查看POSIX的
setDTR()
(在serialposix.py中)的当前实现,似乎此错误未被修复,如果端口未打开,则会引发异常,因此跨平台解决方案看起来不太可能。相关问题 更多 >
编程相关推荐