我试图用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和复位之间的电阻。 然后,在软件:
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(真)会抛出5V对100欧姆的电阻和复位引脚,防止DTR从拉低,复位芯片:)我那么只需要调用setResetDisable(假)当我离开串行模式使芯片可以被编程为正常。
您应该能够打开的端口,这样前禁用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
这似乎是固定源的最新版本中的错误,SVN版本445于2011年12月29日(见http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyserial/serial/serialwin32。 PY =查看日志? )与评论:
允许setRTS,setDTR开口在Win32前(设置初始状态),DOC更新
它看起来像它可能只是错过了2.6版本(载2日2011年11月见: https://pypi.python.org/pypi/pyserial )。
此外,在看目前执行的setDTR()
的POSIX(在serialposix.py )它看起来像这样的错误是不固定的 ,如果端口没有开放,所以一个跨平台的解决方案看起来不太可能会抛出异常。
禁用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线的状态ser.setDTR(level)
-不过我还没有具体的Arduino的自动复位的情况下尝试这样做,我怀疑,即使打开串口后立即触发线可能没有足够快,以防止复位。
其他的选项,我可以看到你有可用的将是阻止的Arduino的硬件自动复位( 见这里 ),或稍微改变你的代码,以便您允许的Arduino后开始进行串行连接重启,然后当您手动触发接收模式串口从Arduino的发送初始信号,显示其现在已准备好接收数据。 或者你也可以包括pySerial库与你的脚本的修改版本。
下面是一个软件解决方案,我一直在使用它自己的一段时间,它的工作原理就像一个魅力:
ser = serial.Serial("/dev/ttyUSB0", 115200, timeout=1)
ser.setDTR(False)
time.sleep(0.5)
请注意,睡眠是最棘手的部分,没有它,它不会工作