Ada*_*ile 9 python serial-port arduino pyserial
我正在尝试使用pyserial将数据发送到arduino.但是当我打开COM端口时,它将DTR设置为低电平并重置电路板.但是,我有我的arduino代码设置,因此我必须通过按住两个按钮1秒钟将其置于串行接收模式.如果可能的话,我宁愿不必在arduino的启动时进行串行输入.
显然你可以修改serialWin32.py文件,改变读取的行:
self._dtrState = win32.DTR_CONTROL_ENABLE
Run Code Online (Sandbox Code Playgroud)
至:
self._dtrState = win32.DTR_CONTROL_DISABLE
Run Code Online (Sandbox Code Playgroud)
但是,有没有办法直接在我的python脚本中禁用它?我还需要为所有系统执行此操作.我宁愿不强迫人们改变他们的基本串行配置只是为了使用这个脚本.
串口打开如下:
com = serial.Serial(port, baud, timeout=1);
Run Code Online (Sandbox Code Playgroud)
更新:最后我找到了一个适合我的设置的解决方案.由于我不需要一直使用串行数据,只有当我将设备置于串行接收模式时,才发现了一种方法来禁用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
}
Run Code Online (Sandbox Code Playgroud)
所以现在,当我想要处于串行模式时,我调用setResetDisable(true),它在该100欧姆电阻和复位引脚上抛出5V,防止DTR将其拉低并重置芯片:)然后我只调用setResetDisable(false) )当我离开串行模式时,芯片可以正常编程.
Mat*_*och 11
您应该能够在打开端口之前禁用DTR,如下所示:
com = serial.Serial()
com.port = port
com.baudrate = baud
com.timeout = 1
com.setDTR(False)
com.open()
Run Code Online (Sandbox Code Playgroud)
但是,在Windows上当前版本的pyserial(2.6)上执行此操作会引发以下异常:
..., line 315, in setDTR
ValueError: Attempting to use a port that is already open
Run Code Online (Sandbox Code Playgroud)
这似乎是一个错误,该错误已在2011年12月29日的最新版源SVN修订版445中修复(请参阅http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyserial/serial/serialwin32. py?view = log)评论:
在Win32上打开之前允许setRTS,setDTR(设置初始状态),doc update
看起来它可能刚刚错过了2.6版本(2011年11月2日上传,请参阅:https://pypi.python.org/pypi/pyserial).
此外,查看setDTR()POSIX 的当前实现(在serialposix.py中),看起来这个bug没有修复,如果端口没有打开则抛出异常,因此跨平台解决方案看起来不太可能.
禁用 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()
Run Code Online (Sandbox Code Playgroud)