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?

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top