2

我目前正在对 CAN 节点进行一些测试,我正在使用 python-can 和 Linux SocketCAN 从节点发送和接收 CAN 帧。

定期发送和接收工作正常,但现在我想注入故障并查看 CAN 节点的行为。

有谁知道是否可以这样做,例如通过更改帧的 CRC。我已经进行了一项测试,其中我关闭了 CAN 接口,因此节点总线关闭,但还有更多 CAN 错误需要测试。

编辑:为了清楚起见:我正在开发一个测试框架,使用 pytest 和 python-can,并且对于 CAN 帧的定期发送,我有以下代码:

import can
bus = can.interface.Bus(bustype='socketcan', channel='can0', bitrate=250000)
msg = can.Message(arbitration_id=can_id,
                  data=data,
                  is_extended_id=False)
bus.send(msg)

在这里它停止了,我可以为 API 阅读什么,这里没有错误注入选项(Pyhon-can API)。

我今天拥有的另一个例子:

import can
bus = can.interface.Bus(bustype='socketcan', channel='can0', bitrate=250000)
msg = can.Message(arbitration_id=can_id,
                  data=data,
                  is_error_frame=True)
bus.send(msg)

以上代码在总线上生成错误帧,这是我正在设计的故障处理测试的一部分。

4

2 回答 2

0

我现在对此进行了更多调查,并与我的 CAN 加密狗的硬件供应商进行了核实。看来我想做的事情从 SW 端是不可能的,我需要购买另一个可以支持这种错误注入的 HW CAN 加密狗。

硬件供应商还告诉我,这些测试通常是由 CAN 控制器供应商完成的,所以这不是(据他说)不是一个正常且简单的测试用例。

所以我现在离开这个话题,并继续进行其他测试。

于 2020-12-03T09:46:54.463 回答
0

所以,我不熟悉图书馆,但是似乎是图书馆中唯一暴露CRC这个词的地方。

我担心可能没有本地方法可以做到这一点,但您可能会扩展库的类并自己覆盖 CRC 字段。

can.message的实现不会让您接触 CRC。但是,这是一个“meh”消息,因为在您第一次创建can.message()对象时不会计算 CRC。

该方法中的快速搜索socketcan.send()也没有提到 CRC,因此它可能会在两者之间的某个地方计算。或者,我更担心这一点,它是由一个在类中再次libc引用的外部库计算的:can.interfaces.socketcan

try:
    libc = ctypes.CDLL(ctypes.util.find_library("c"), use_errno=True)
    libc.bind.errcheck = check_status
    libc.connect.errcheck = check_status
    libc.sendto.errcheck = check_status
    libc.recvfrom.errcheck = check_status
except:
    log.warning("libc is unavailable")
    libc = None

如果是这种情况,您将很难尝试解决 CRC。我真诚地希望这可以为您指明正确的方向,由于我对这个特定库的了解非常有限,我真的无法做更多的事情。

于 2020-11-23T10:03:11.320 回答