-1

我有以下代码

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()

我想每次都退回味精,我该怎么办?有人能帮我吗?

4

3 回答 3

0

您可能想要考虑将您的函数变成一个生成器,使用yield关键字而不是return. 这样,以 结束您的循环yield MSG,您的函数将生成一系列消息,循环中的每次迭代都有一条消息。

当您的生成器结束时,MSGNone引发StopIteration异常,使for循环按预期终止。

最后,您可以按如下方式构建代码:

def callee():
    while ...:
        elem = ...
        yield elem

def caller():
    for elem in callee():
        ...
于 2019-04-27T09:26:41.723 回答
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.
于 2019-04-27T10:16:05.430 回答
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
于 2019-04-27T13:56:08.353 回答