在这里,我正在通过串行端口从Arduino读取数据,Arduino不断以9600的波特率发送数据。数据发送类似于“ AGVtoUPF”,持续数十秒,然后发送下一个数据,数十秒,等等。
我需要根据收到的数据触发不同的事件。
在没有计划的情况下,我在这里观察到的是我收到的数据正确且快速。但是当计划中的一个被触发时,我在接收数据上出现了延迟(例如,Arduino正在发送下一个数据,但是Kivy仍然显示最后一个数据约3秒钟,这是一个巨大的延迟!)。
我不确定这是因为我以错误的方式安排/取消安排事件,还是因为在安排了某些事情后,kivy的fps不能赶上波特率。
这是时间表/时间表发生的代码
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()
和{ {1}}在if / else情况下进行排程/取消排程
但是当我执行event_trigger.cancel()
时,它会以某种方式产生错误。因此,我提出了上述方法,我在Kivy文档中看到不建议使用event_trigger = Clock.schedule_interval(self.ids.agvin.transfer)
,这是导致程序延迟的原因吗?
请告知是否有人对此有所了解。
请告诉我是否也必须提供更多信息!
提前谢谢!
UPDATE
根据建议,我更改了调度方式,这是我的新代码
Clock.unschedule(self.ids.agvin.transfer)
但是接收数据的延迟仍然存在,并且仅在我播放动画时才会发生,请帮忙。
答案 0 :(得分:0)
将调度或触发器分配给属性,例如
self.event_trigger = Clock.create_trigger(self.ids.agvin.transfer, 1.75)
self.event_trigger()
self.event_read = Clock.schedule_interval(self.Read,1.0/60.0)
Clock.unschedule(self.event_trigger)
Clock.unschedule(self.event_read)
或
self.event_trigger.cancel()
self.event_read.cancel()