2010-02-20 16 views
5

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" y trato de ejecutarlo, no pasa nada. Aunque las luces de serie en mi UART parpadean. Así que algo está llegando, pero es basura (lo revisé).PySerial La aplicación se ejecuta en shell, por script no py

Aquí está el código simple.

import serial 

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

Ya he intentado agregar duerme, pero nada parece arreglarlo. ¿Algunas ideas?

+0

Ha intentado grabados, así como duerme, para probar este código se ejecuta en realidad? Además, ¿cómo estás definiendo "no pasa nada"? ¿Está basado en observar a tu Arduino? ¿Qué se supone que debe hacer el personaje "A"? –

+1

He agregado impresiones y, de hecho, está ejecutándose. Cuando el arduino recibe la "A", se supone que debe comenzar a parpadear un LED. Ese comportamiento funciona bien cuando lo ejecuto manualmente, pero no cuando intento ejecutar el script. –

+0

entonces nadie sabe cómo arreglar esto ¿eh? –

Respuesta

7

¡Bien, lo he descubierto!

Es necesario usar un código como éste 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!

+1

El restablecimiento es necesario para programar el arduino. Puede modificar su Arduino para que no se restablezca en la conexión serial si es necesario. – Dustin

0

Quizás sea estúpido, pero intente escribir solo "myscript.py" en cmd.exe, si está en Windows. Me di cuenta de 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.

+0

sin suerte con este método tampoco ... –

+0

¡Alguien tiene alguna otra idea! ¡He visto a otras personas con el mismo problema en toda la web y nadie parece tener una respuesta! –

1

Me he dado cuenta de 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 utilizando el código mencionado anteriormente

time.sleep(1) 

ser.setDTR(level=0) 

time.sleep(1) 

anexa antes de la escritura, y recordando el cierre del puerto después, yo era capaz de conseguirlo para que funcione 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 comando 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.

0

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 razón es que los ordenadores se están volviendo tan rápido (superior a 1 millones cuando el rendimiento de mi primera x86 a 4,77 MHz, probablemente cien mil veces más rápido que el transbordador espacial a bordo de equipo original) para que dé tener tiempo para iniciar Python, ejecutar millones de instrucciones ... cerrar la consola, todo eso antes de que se haya enviado un solo byte en el puerto serie.

0

En mi caso, lo siguiente funcionó.

time.sleep(1) 
    ser.setDTR(level=1) 
    time.sleep(1) 
1
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 
+0

Después de volver a cablear, cambiar las fuentes de alimentación y sacar la mayoría de mis pelos, esto me lo resolvió. –

Cuestiones relacionadas