0

我正在使用 python-can 来发送带有 VN16XX Vector 硬件的 can 帧,而不依赖于 CANoe(不需要许可,我们可以与没有安装 CANoe 的实体共享该工具)。

我现在正在运行的最简单的示例如下:

import can
import time
from ctypes import c_int, byref, windll
current_res = c_int()

if __name__ == "__main__":
    windll.ntdll.NtSetTimerResolution(5000, True, byref(current_res))
    try:
        bus1 = can.interface.Bus(bustype='vector', app_name='testApp', channel=2, bitrate=500000, fd=True, data_bitrate = 1000000)
    except Exception as e:
        print (e)
        exit()

    msg1 = can.Message(arbitration_id=0x201,
                       data=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
                       extended_id=False, is_fd=True)

    task = bus1.send_periodic(msg1, period=0.010, duration=10)
    assert isinstance(task, can.CyclicSendTaskABC)
    time.sleep(10)
    task.stop()
    print("stopped cyclic send")
    windll.ntdll.NtSetTimerResolution(5000, False, byref(current_res))

在这里,我使用 NtSetTimerResolution 来实现 500us 的计时器分辨率,如this answer中所述。

问题是:输出信号有抖动。外部示波器显示高达 ± 2 ms 的抖动,这对我的应用程序来说是不可接受的。

这里的问题:

    • 如何减少输出帧的抖动?
    • Vector 如何在输出帧上实现精确计时?我不认为 Vector 定时器依赖于外部硬件,因为我也可以创建定时器实例来发送没有连接 VN16xx 的 UART 帧,并且在这种情况下也不存在抖动。
    • 也许它与python开销有关?切换到 Cython 会提供更好的性能吗?

韩国

4

0 回答 0