通过pyserial接收多个值并在Python GUI中显示

通过pyserial接收多个值并在Python GUI中显示,python,serial-port,arduino,pyserial,Python,Serial Port,Arduino,Pyserial,我正在尝试使用Python中的串行通信来接收数据,我可以这样做,但我需要改进我的代码 我正在从Arduino发送一个“数据包”,格式为“&4,25/n”,关键因素是“4”和“25”位置的值。在这个包中,我将“&”作为起始字节,将新行馈送“/n”作为终止符。这样我就可以知道什么时候发送了一个新的数据包,然后它就结束了 如何接收此数据包“&4,24/n”并提取“4,24”所在位置的值?还值得注意的是,这些值将发生变化,它们将随Arduino发送的传感器值而变化 这是我现在拥有的代码,我用来接收一个单

我正在尝试使用Python中的串行通信来接收数据,我可以这样做,但我需要改进我的代码

我正在从Arduino发送一个“数据包”,格式为“&4,25/n”,关键因素是“4”和“25”位置的值。在这个包中,我将“&”作为起始字节,将新行馈送“/n”作为终止符。这样我就可以知道什么时候发送了一个新的数据包,然后它就结束了

如何接收此数据包“&4,24/n”并提取“4,24”所在位置的值?还值得注意的是,这些值将发生变化,它们将随Arduino发送的传感器值而变化

这是我现在拥有的代码,我用来接收一个单一值,没有起始字节,使用新行馈送来终止数据包

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()
这和一个资源文件一起,给了我一个GUI,可以通过它远程控制我的机器人。此代码从声纳接收一个ping值,并将其报告给GUI以显示。我需要两个不同的ping值来显示两个不同的传感器


更新

下面是正确的代码

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()

谢谢你给我一个简单的回答

尝试拆分文本:

split_data = ping_data.split(',')
split_数据
将包含上述示例的
['4','25']

然后,您可以像这样访问数据:

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

非常感谢你给我一个很好的回答,这正是我想要的。@grinan barrett谢谢。别忘了投票,因为这很有帮助:)