从代码中禁用pyserial中的DTR

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没有修复,如果端口没有打开则抛出异常,因此跨平台解决方案看起来不太可能.

  • @Cerin有同样的问题,但在打开端口之前设置DTR现在适用于我(Windows 8.1 64位上的Python 3.5.1和当前的pySerial 3.1).另请参阅GitHub上"新"存储库中的问题:https://github.com/pyserial/pyserial/issues/124 (2认同)
  • 我还注意到在端口上执行“stty -hup”也可以解决问题。为什么是这样?它与 DTR 有何关联? (2认同)

ima*_*man 5

禁用 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)

我在这里找到