如何让CAN总线能收到远程帧

DEL下可以正常接收远程帧。注意我们提供的CAN例程只是一个非常简单的示例以供参考,如果认真阅读can_test代码,你会看到有一行是接收包的过滤器:

rfilter.can_mask = (main_opts->extended) ? CAN_EFF_MASK : CAN_SFF_MASK

这意味着can_test只接收匹配你ID的帧,其它默认会丢弃掉。远程帧并不匹配你原来的id,而是有一个0x40000000基数,比如你希望收到ID为1的远程帧,那你实际上收到的是ID 0x40000001。

如果您希望收到所有的包,那您需要把掩码全改为0。

rfilter.can_mask = 0x00000000U;

在can_test.c中按上述方法更改并重新编译,加载到文件系统执行时,当发送远程帧你会看到:

Running the test as RECEIVER
[ INFO ] Testing with 1000 loops
[ INFO ] Starting the thread for the ID 0x1
[ DEBUG ] Frame 1 with ID 0x40000001 received
[ ERROR ] Different CAN-frames at loop 1
        * EXPECTED: ID 0x001 | DLC 0x00 | DATA 
        * RECEIVED: ID 0x40000001 | DLC 0x00 | DATA 
root@ccardimx28js:~#

注意,系统预编译自带的can_test并不总是同Digi测试过的例程保持一致。如果您按上述方法没法得到想要的结果,请参考Digi用于接口功能测试的示例:

can_test v2.1