Получать несколько значений через pyserial и отображать в Python GUI - PullRequest
1 голос
/ 27 мая 2011

Я пытаюсь получить данные, используя последовательную связь в 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 Ответ

2 голосов
/ 27 мая 2011

Попробуйте разделить текст:

split_data = ping_data.split(',')

split_data будет содержать ['4', '25'] для приведенного выше примера.
Вы можете получить доступ к данным следующим образом:

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