Я пытаюсь получить данные, используя последовательную связь в 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()
Спасибо за отличный и простой ответ!