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!