La aplicación pyserial se ejecuta en shell, por no script py
-
21-09-2019 - |
Pregunta
Tengo un script Python muy simple que utiliza Pyserial para enviar datos a través del puerto serie a mi Arduino. Cuando ejecuto esta línea por línea en el shell de Python, funciona bien, pero cuando lo pongo en un archivo ".py" e intento ejecutarlo, no pasa nada. Aunque las luces de serie en mi UART hacen flash. Entonces, algo está pasando, pero es basura (lo revisé).
Aquí está el código simple.
import serial
ser = serial.Serial('COM3',9600,timeout=.2)
ser.write('A')
ser.close()
Ya he intentado agregar sueño, pero nada parece estar arreglándolo. ¿Algunas ideas?
Solución
Ok, ¡lo he descubierto!
Es necesario usar un código como este antes de realizar la escritura:
time.sleep(1)
ser.setDTR(level=0)
time.sleep(1)
De lo contrario, el Arduino se restablece automáticamente al recibir una conexión en serie por alguna razón. ¡Hurra!
Otros consejos
He notado que si estás en Windows de 64 bits, entonces el Pyserial simplemente no funciona. Estoy usando Python 2.7, y después de instalar la versión x86 a través de la cuenta de administrador, y usando el código mencionado anterior
time.sleep(1)
ser.setDTR(level=0)
time.sleep(1)
Agradecido antes de la escritura, y recordando el cierre del puerto después, pude hacer que funcionara como un script y no solo a través de la CLI. Además, asegúrese de ejecutar la GUI de Python o la línea de comandos como administrador. Esto también hizo una diferencia exitosa para mí. Además, asegúrese de que el monitor en serie en el Arduino esté cerrado antes de ejecutar el código.
import serial
import time
ser = serial.Serial('/dev/ttyACM1', 9600, timeout=1)
time.sleep(3) # this will needed for initializing arduino
serial.write(b'1') # b is necessary for byte
Tal vez sea estúpido, pero trate de escribir solo "myscript.py" en cmd.exe, si está en Windows. He notado que en Windows, no necesita escribir "Python" antes del nombre del script. Esto es, por supuesto, para la instalación estándar de CPython en Windows.
Puedo sugerir un sueño más, esta vez, después de cerrar el puerto serie.
import serial
ser = serial.Serial('COM3',9600,timeout=.2)
ser.write('A')
ser.close()
time.sleep(3000)
//for a first test, give a whopping 3 seconds
//sleep(100), 100 ms (0.1 second) may be enough in final product
La justificación es que las computadoras se están volviendo tan rápidas (superan los 1 millones de veces el rendimiento de mi primer x86 a 4.77 MHz, probablemente cien mil veces más rápido que el transbordador espacial a bordo de la computadora original) que puede tener tiempo para iniciar Python, ejecutar Millones de instrucciones ... Cierre la consola, todo eso antes de que se haya enviado un solo byte en el puerto serie.
En mi caso, lo siguiente funcionó.
time.sleep(1)
ser.setDTR(level=1)
time.sleep(1)