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

1 投票
1 回答
3519 浏览
提问于 2025-04-16 18:28

我正在尝试用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()

这个代码,加上一个资源文件,让我可以通过VNC远程控制我的机器人。这个代码接收来自声纳的一个ping值,并将其报告给图形界面显示。我需要显示来自两个不同传感器的两个不同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()

感谢你提供了一个很棒且简单的答案!

1 个回答

3

试着把文本分开:

split_data = ping_data.split(',')

split_data 这个变量会包含 ['4', '25'],就像上面的例子一样。
然后你可以这样访问这些数据:

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

撰写回答