serial raspberry libreria leer encender descargar datos conexion con comunicacion python serial-port arduino pyserial

raspberry - Reciba múltiples valores a través de pyserial y visualícelos en la GUI de Python



python y arduino pdf (1)

Intenta dividir el texto:

split_data = ping_data.split('','')

split_data contendrá [''4'', ''25''] para el ejemplo anterior.
A continuación, puede acceder a los datos de esta manera:

first_val = split_data[0] second_val = split_data[1]

Estoy tratando de recibir datos mediante comunicación serial en Python, lo que puedo hacer, pero necesito mejorar mi código.

Estoy enviando un "paquete" de Arduino que tiene la forma de "& 4,25 / n" con los factores clave siendo los valores en las posiciones de "4" y "25". En este paquete, tengo el "&" como un byte de inicio, y el nuevo avance de línea "/ n" como un terminador. Esto es para poder saber cuándo se envía un nuevo paquete y finaliza.

¿Cómo puedo recibir este paquete "& 4,24 / n" y extraer los valores que están en las ubicaciones que "4,24"? También puede valer la pena señalar que los valores cambiarán, variarán según los valores del sensor enviados desde el Arduino.

Aquí está el código que tengo ahora, que uso para recibir un solo valor, sin startbyte, usa el nuevo avance de línea para terminar el paquete.

import serial ser = serial.Serial(''/dev/ttyUSB0'', 9600) from PythonCard import model class MainWindow(model.Background): def on_SetSpdBtn_mouseClick(self, event): spd = self.components.SpdSpn.value def on_FwdBtn_mouseClick(self, event): spd = self.components.SpdSpn.value ser.write(''@'') ser.write(''F'') ser.write(chr(spd)) def on_LftBtn_mouseClick(self, event): spd = self.components.SpdSpn.value ser.write(''@'') ser.write(''L'') ser.write(chr(spd)) def on_RitBtn_mouseClick(self, event): spd = self.components.SpdSpn.value ser.write(''@'') ser.write(''R'') ser.write(chr(spd)) def on_RvsBtn_mouseClick(self, event): spd = self.components.SpdSpn.value ser.write(''@'') ser.write(''B'') ser.write(chr(spd)) def on_StpBtn_mouseClick(self, event): spd = self.components.SpdSpn.value ser.write(''@'') ser.write(''S'') ser.write(chr(spd)) def on_GetPing_mouseClick(self, event): ser.write(''~'') ser.write(''P1'') ser.write(''p2'') retval = ser.readline() ping_data = retval.strip() # strip out the newline self.components.PngDis.text = str(ping_data) app = model.Application(MainWindow) app.MainLoop()

Esto, junto con un archivo de recursos, me da una GUI para controlar mi robot de forma remota a través de VNC . Este código recibe un valor ping de un sonar y lo informa a la GUI que se mostrará. Necesito dos valores de ping diferentes para que se muestren dos sensores diferentes.

Actualizar

<Respondido por el comentario siguiente.> Aquí está el código correcto que funciona.

import serial ser = serial.Serial(''/dev/ttyUSB0'', 9600) from PythonCard import model class MainWindow(model.Background): def on_SetSpdBtn_mouseClick(self, event): spd = self.components.SpdSpn.value def on_FwdBtn_mouseClick(self, event): spd = self.components.SpdSpn.value ser.write(''@'') ser.write(''F'') ser.write(chr(spd)) def on_LftBtn_mouseClick(self, event): spd = self.components.SpdSpn.value ser.write(''@'') ser.write(''L'') ser.write(chr(spd)) def on_RitBtn_mouseClick(self, event): spd = self.components.SpdSpn.value ser.write(''@'') ser.write(''R'') ser.write(chr(spd)) def on_RvsBtn_mouseClick(self, event): spd = self.components.SpdSpn.value ser.write(''@'') ser.write(''B'') ser.write(chr(spd)) def on_StpBtn_mouseClick(self, event): spd = self.components.SpdSpn.value ser.write(''@'') ser.write(''S'') ser.write(chr(spd)) def on_GetPing_mouseClick(self, event): ser.write(''~'') ser.write(''P1'') ser.write(''p2'') retval = ser.readline() ping_data = retval.strip() # strip out the newline, if you read an entire line split_data = ping_data.split('','') L_Ping = split_data[0] R_Ping = split_data[1] self.components.PingLeft.text = str(L_Ping) self.components.PingRight.text = str(R_Ping) app = model.Application(MainWindow) app.MainLoop()

Gracias por una respuesta genial y simple!