我使用python-can
轮询CAN总线以获取消息。我为此创建了一个类,如下所示。
class VS():
def __init__(self):
#code to initialise bus
self.message = bus.recv() #to receive 1 message
def speed(self):
return self.message[1], self.message.timestamp
现在总线输出速度每100毫秒,所以当我运行以下
时v = VS()
while(1):
print(v.speed())
time.sleep(1)
我将时间戳分隔100毫秒,而不是每1秒更新一次时间戳。这虽然滞后于实时,因为消息似乎存储在缓冲区或其他内容中。我想重写类/函数,以便我可以获得所需间隔的速度值(当然大于100毫秒)。我试图通过线程运行它并重新定义了速度函数。
def speed(self):
threading.Timer(0.01,self.speed).start()
return self.message[1], self.message.timestamp
现在这种方法有效但在我的Raspberry Pi上只有一段时间了。我甚至通过threading.active_count()
检查线程,然后从70开始,然后在线程252(RuntimeError: can't start new thread
)中抛出异常。然后,线程计数以10为间隔从252减少到0,然后返回常量值。
答案 0 :(得分:0)
我想我自己解决了这个问题。我在类的构造函数中创建了一个线程。此外,初始化self
等函数中使用的speed
变量似乎很重要。重写的代码是
class VS():
def __init__(self):
#code to initialise bus
self.message = bus.recv() #to receive 1 message
self.t = Thread(target = self.speed, args = ())
self.t.start()
def speed(self):
while True:
self.message = bus.recv()
return self.message[1], self.message.timestamp