La aplicación PySerial se ejecuta en shell, no por script Py

Tengo un script de python muy simple que usa 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 coloco en un archivo “.py” e bash ejecutarlo, no sucede nada. Aunque las luces de serie en mi UART no parpadean. Entonces algo está pasando, pero es basura (lo verifiqué).

Aquí está el código simple.

import serial ser = serial.Serial('COM3',9600,timeout=.2) ser.write('A') ser.close() 

Ya he intentado agregar dormidos, pero nada parece estar arreglando eso. ¿Algunas ideas?

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 reinicia automáticamente al recibir una conexión en serie por alguna razón. ¡Hurra!

Me he dado cuenta de que si estás en Windows de 64 bits, entonces la 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 usar el código mencionado anteriormente

 time.sleep(1) ser.setDTR(level=0) time.sleep(1) 

adjuntado 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 o la línea de comandos de python como administrador. Esto también hizo una diferencia exitosa para mí. Además, asegúrese de que el monitor 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 intente escribir solo “myscript.py” en cmd.exe, si está en Windows. He notado que en Windows, no es necesario que escriba “python” antes del nombre del script. Esto es, por supuesto, para la instalación estándar de CPython en Windows.

Puedo sugerirle una suspensión 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 razón es que las computadoras se están volviendo tan rápidas (más de 1 millón de veces el rendimiento de mi primer x86 a 4,77 MHz, probablemente cien mil veces más rápido que la Transbordador Espacial a bordo de la computadora original) que puede tener tiempo para iniciar Python, ejecute millones de instrucciones … cierre la consola, todo eso antes de que se haya enviado un solo byte en el puerto serie.

En mi caso funcionó lo siguiente.

  time.sleep(1) ser.setDTR(level=1) time.sleep(1)