serial libreria leer graficar encender descargar datos conexion con comunicar adquisicion python serial-port arduino

libreria - leer datos de arduino con python



Transmisión continua de datos de Arduino a Python(líneas de lectura que fallan) (1)

¿No tienes el Arduino IDE Serial Monitor abierto también? Pasé una tarde "feliz" depurando mi "código de interfaz de Python a Arduino" antes de darme cuenta de que lo había dejado abierto y estaba comiendo caracteres ocasionales :)

Ciertamente he usado el muy simple Serial.write() y Serial.println() junto con readline() para ejecutar pruebas continuas de "comando / respuesta" durante muchas decenas de minutos a la vez (muchos miles de líneas de envíos y recepciones) )

Intento leer continuamente datos de mi Arduino Nano a través de un script de Python. Pero la mayoría de las veces, la línea de lectura fallaría arrojando una excepción o devolvería datos corruptos, como perder un dígito.

Aquí está la parte de conexión:

El código Arduino:

void loop() { // Send data only when you receive data: if (Serial.available() > 0) { // Check if it''s the right signal. if (Serial.read()==''S'') { // Send a string containing the rows and cols number. send_rows_cols(); } // if(Serial.read()==''S'') else { send_data(); } // END: else if( Serial.read()==''Y'') }// if(Serial.available() > 0) }

En send_rows_cols() , estoy usando Serial.write , porque funciona, pero en send_data() tuve que usar Serial.println() para devolver los datos.

La parte de Python. Aquí está el camino ridículo que tuve que usar hasta que se devolvieron los valores legítimos.

import serial import time locations=[''/dev/ttyUSB0'',''/dev/ttyUSB1'',''/dev/ttyUSB2'',''/dev/ttyUSB3'', ''/dev/ttyS0'',''/dev/ttyS1'',''/dev/ttyS2'',''/dev/ttyS3''] for device in locations: try: print "Trying...",device arduino = serial.Serial(device, 9600) break except: print "Failed to connect on",device rows_cols ='''' try: while True: arduino.write(''S'') rows_cols = str(arduino.readline()) print len(rows_cols) print rows_cols if ( len(rows_cols)>3 ): break except: print "Failed to send!"

Hasta este punto, funciona después de una o dos líneas de lectura. Que es asequible. Más tarde, tuve que usar un código aún más loco. Enviar un personaje de Python a Arduino para que la conexión no muera, entonces como puede ver, Arduino tiene que esperar a ese personaje. Después de que Arduino recibe ese personaje, envía los datos que deseo (una cadena de números separados por comas).

Esta última parte de Python es lo que envía el carácter ''Y'' y la línea de lectura del Arduino, una y otra vez hasta que no haya ninguna excepción o datos corruptos. Tantos bucles para nada.

Lo que me gustaría es una forma de obtener continuamente datos de mi Arduino sin tener ese "apretón de manos" todo el tiempo y que los datos no sean basura todo el tiempo.

¿Hay tal manera? Tal vez una opción de tiempo de espera para el serial?