Здесь я читаю данные из Arduino через последовательный порт, Arduino постоянно отправляет данные со скоростью 9600 бод. Отправка данных в течение нескольких десятков секунд напоминает «AGVtoUPF», а затем следующие данные в течение нескольких десятков секунд и т. Д. .
Мне нужно вызвать другое событие в соответствии с данными, которые я получил.
Здесь я наблюдаю, что данные, которые я получаю, правильные и быстрые, когда ничего не запланировано. Но когда срабатывает один из графиков, я получаю задержку в получении данных (например, Arduino отправляет следующие данные, но Kivy все еще показывает последние данные в течение ~ 3 секунд, ОГРОМНАЯ задержка !!).
Я не уверен, что это потому, что я неправильно планирую / отменяю события или fps of kivy не может догнать скорость передачи, когда что-то запланировано.
Вот код, где происходит расписание / внеплановое
class OperationScreen(Screen):
def __init__(self,**kwargs):
super(OperationScreen,self).__init__(**kwargs)
Clock.schedule_interval(self.Read,1.0/60.0)
def Read(self,dt):
data = arduino.readline()
if data =='':
pass
if data != '' and data != self.ids.data_label.text:
self.ids.data_label.text = data
if data == 'AGVtoUPFt\r\n':
print("1")
Clock.schedule_interval(self.ids.upf.transfer,1.75)
Clock.schedule_interval(self.ids.agvin.transfer,1.75)
elif data =='AGVtoUPFv\r\n':
print("2")
Clock.schedule_interval(self.ids.upf.vacuum,1.75)
elif data =='AGVtoUPFvi\r\n':
print("3")
Clock.schedule_interval(self.ids.upf.vacin,1.75)
elif data =='AGVtoUPFi\r\n':
print("4")
Clock.schedule_interval(self.ids.upf.inert,1.75)
else:
Clock.unschedule(self.ids.agvin.transfer)
Clock.unschedule(self.ids.upf.inert)
Clock.unschedule(self.ids.upf.transfer)
Clock.unschedule(self.ids.upf.vacuum)
Clock.unschedule(self.ids.upf.vacin)
Я сделал случай if / else таким образом, потому что не хочу, чтобы одно и то же событие вызывалось дважды.
Я пытался объявить событие, подобное event_trigger = ObjectProperty(None)
в class OperationScreen(Screen)
, затем сделать event_trigger = Clock.schedule_interval(self.ids.agvin.transfer)
в __init__
, чтобы я мог напрямую использовать event_trigger()
и event_trigger.cancel()
в случае if / else для расписание / unscheduling
Но как-то выдает ошибку, когда я делаю event_trigger = Clock.schedule_interval(self.ids.agvin.transfer)
. Таким образом, я описал вышеописанный метод, я видел, что в документации Kivy не рекомендуется использовать Clock.unschedule(self.ids.agvin.transfer)
, не является ли это причиной такой задержки в моей программе?
Пожалуйста, советуйте, если кто-нибудь что-нибудь знает об этом.
Пожалуйста, скажите мне, если я должен предоставить больше информации!
Заранее спасибо !!
UPDATE
Как и предполагалось, я изменил свой метод планирования, вот мой новый код
class OperationScreen(Screen):
event_read = ObjectProperty(None)
upf_transfer = ObjectProperty(None)
agv_trigger = ObjectProperty(None)
upf_vacuum = ObjectProperty(None)
upf_vacin = ObjectProperty(None)
upf_inert = ObjectProperty(None)
def __init__(self,**kwargs):
super(OperationScreen,self).__init__(**kwargs)
self.event_read = Clock.schedule_interval(self.Read,1.0/60.0)
self.event_read()
def Read(self,dt):
data = arduino.readline()
if data =='':
pass
if data != '' and data != self.ids.data_label.text:
self.ids.data_label.text = data
if data == 'AGVtoUPFt\r\n':
print("1")
self.agv_trigger = Clock.schedule_interval(self.ids.agvin.transfer,1.75)
self.agv_trigger()
self.upf_transfer = Clock.schedule_interval(self.ids.upf.transfer,1.75)
self.upf_transfer()
elif data =='AGVtoUPFv\r\n':
print("2")
self.upf_vacuum = Clock.schedule_interval(self.ids.upf.vacuum,1.75)
self.upf_vacuum()
elif data =='AGVtoUPFtvi\r\n':
print("3")
self.upf_vacin = Clock.schedule_interval(self.ids.upf.vacin,1.75)
self.upf_vacin()
elif data =='AGVtoUPFti\r\n':
print("4")
self.upf_inert = Clock.schedule_interval(self.ids.upf.inert,1.75)
self.upf_inert()
else:
Clock.unschedule(self.agv_trigger)
Clock.unschedule(self.upf_inert)
Clock.unschedule(self.upf_vacin)
Clock.unschedule(self.upf_vacuum)
Clock.unschedule(self.upf_transfer)
Но задержка в получении данных все еще есть, и это происходит только тогда, когда у меня идет анимация, пожалуйста, помогите.