test serial read open name library python serial-port arduino pyserial

python - read - Deshabilitar DTR en pyserial del código



python serial library read (4)

El método que describes parece ser la solución más común para este problema que he visto, así que sospecho que no hay una solución más simple basada en software. Por supuesto, puede cambiar manualmente el estado de la línea DTR utilizando ser.setDTR(level) ; sin embargo, no lo he probado específicamente en el caso del autorretrato Arduino, y sospecho que incluso al alternar la línea inmediatamente después de abrir el puerto serie puede no ser lo suficientemente rápido para evitar el reinicio.

Las otras opciones que puedo ver que tiene disponibles serían evitar el autoreset del Arduino en hardware ( ver aquí ), o cambiar su código levemente para permitir que el Arduino se reinicie después de hacer inicialmente la conexión serie, y luego cuando usted activa manualmente su modo de recepción en serie, envía una señal inicial del Arduino para mostrar que ahora está listo para recibir datos. O, como alternativa, podría incluir una versión modificada de la biblioteca pySerial con su secuencia de comandos.

Estoy tratando de usar pyserial para enviar datos a un arduino. Pero cuando abro el puerto COM, establece DTR bajo y restablece la placa. Sin embargo, tengo mi configuración de código arduino de modo que tengo que ponerlo en modo de recepción en serie manteniendo presionados dos botones durante 1 segundo. Preferiría no tener que hacer la entrada en serie al arrancar el arduino, si es posible.

Aparentemente puede modificar el archivo serialWin32.py, cambiando la línea que dice:

self._dtrState = win32.DTR_CONTROL_ENABLE

a:

self._dtrState = win32.DTR_CONTROL_DISABLE

Pero, ¿hay alguna forma de desactivar esto directamente en mi script python? También necesito hacer esto para todos los sistemas. Preferiría no forzar a las personas a cambiar sus configuraciones de serie base solo para usar este script.

El puerto serie se abre de la siguiente manera:

com = serial.Serial(port, baud, timeout=1);

Actualización: Al final encontré una solución que funciona bien para mi configuración. Como no necesitaba hacer datos en serie todo el tiempo, solo cuando puse el dispositivo en modo de recepción en serie encontré una forma de desactivar el restablecimiento en la conexión en serie desde el propio Arduino.

Muchas publicaciones han dicho que puedes desactivar el reinicio del DTR colocando un resistor de ~ 100 Ohm entre 5V y restablecer. Pero no quería que esto fuera algo permanente. Entonces, en su lugar coloqué una resistencia entre PD5 y reinicio. Luego, en el software:

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 }

Así que ahora, cuando quiero estar en modo serial, llamo a setResetDisable (true) que arroja 5V en esa resistencia de 100 ohmios y el pin de reinicio, impidiendo que DTR lo baje y reinicie el chip :) Entonces solo llamo a setResetDisable (falso ) cuando salgo del modo serie para que el chip se pueda programar de forma normal.


Debería poder deshabilitar DTR antes de abrir el puerto, así:

com = serial.Serial() com.port = port com.baudrate = baud com.timeout = 1 com.setDTR(False) com.open()

Sin embargo, al hacerlo en la versión actual de pyserial (2.6) en Windows arroja la siguiente excepción:

..., line 315, in setDTR ValueError: Attempting to use a port that is already open

Esto parece ser un error que está corregido en la última versión de la revisión fuente SVN 445 del 29 de diciembre de 2011 (ver http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyserial/serial/serialwin32). py? view = log ) con comentario:

permitir setRTS, setDTR antes de abrir en Win32 (para establecer el estado inicial), actualización de documento

Que parece haber perdido la versión 2.6 (publicada el 2 de noviembre de 2011, ver: https://pypi.python.org/pypi/pyserial ).

Además, al observar la implementación actual de setDTR() para POSIX (en serialposix.py ) parece que este error no se soluciona y se lanza una excepción si el puerto no está abierto, por lo que una solución multiplataforma parece improbable.


Aquí hay una solución de software, la he estado usando por un tiempo y funciona como un encanto:

ser = serial.Serial("/dev/ttyUSB0", 115200, timeout=1) ser.setDTR(False) time.sleep(0.5)

Tenga en cuenta que el sueño es la parte difícil, sin él no funcionará


Desactivar DTR no funciona para mí:
ser.dtr = None
(Linux 4.4.0 x86_64 / Python 2.7.12 / PySerial 3.4)

Pero esto funciona:

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()

Lo encontré aquí .