我有以下代码
import can
def abcd():
bus = can.interface.Bus(channel= '1', bustype='vector',app_name = 'python-can')
MSG = bus.recv(0.5)
while MSG is not None:
MSG = bus.recv(1)
return MSG
if __name__ == '__main__':
abcd()
我想每次返回MSG怎么办? 有人可以帮我吗?
答案 0 :(得分:0)
您可能想考虑使用yield
而不是return
关键字将函数转换为生成器。这样,以yield MSG
结束循环,您的函数将生成一系列消息,该循环中的每个迭代都有一个消息。
当生成器结束时,MSG
为None
时,将引发StopIteration
异常,使for
循环按预期终止。
最后,您可以按以下方式构建代码:
def callee():
while ...:
elem = ...
yield elem
def caller():
for elem in callee():
...
答案 1 :(得分:0)
@Elia Geretto提到过,您可能需要将其转换为生成器函数。让我知道这会有所帮助。
import can
def abcd():
bus = can.interface.Bus(channel= '1', bustype='vector',app_name = 'python-can')
MSG = bus.recv(0.5)
while MSG is not None:
MSG = bus.recv(1)
yield MSG
if __name__ == '__main__':
for op in abcd():
print(op) # or you can use next() as well.
答案 2 :(得分:0)
我不确定您想要什么,但是我认为问题之一是每次创建bus
对象。您可以尝试以下代码。我自己无法测试,因为我没有可用的CAN总线。我也不确定该方法应该返回什么。如果您可以改善问题,我也可以改善答案:-)
import can
def read_from_can(bus):
msg = bus.recv(0.5)
while msg is not None:
msg = bus.recv(1)
return msg
def main():
# create bus interface only once
bus = can.interface.Bus(channel='1', bustype='vector', app_name='python-can')
# then read (for example) 10 times from bus
for i in range(10):
result = read_from_can(bus)
print(result)
if __name__ == '__main__':
main() # Tip: avoid putting your code here; use a method instead