问题现象
调试能收到A报文,不调试不能收到。单板上就能够出现,这就比较好复现了。
问题分析
那就重点关注不调试时候的情况了,以下操作都是在不调试的情况下操作的。
在COM层接收回调函数打标志位发送到CAN上,默认值为0,收到变成1,超时丢失变成2,发现没有收到,直接从0变成2。
在canif层判断接收到的报文,如果是A报文,就把标志位置起来,发现并没有置起。
那问题肯定在MCAL层了。
就查询MCAL层的配置,初始化正常,能进入中断回调,中断回调当中有接收到A报文,就是报文分发的时候出问题。
问题结论
检查配置发现配置了两个一模一样的接收硬件对象,只是object ID不同。按照原理来说,报文进来之后会优先分配给object ID小的那一个硬件对象,结果canif层关联的是object ID大的那一个,在单板上面自然运行不起来。
调试的时候收发器一直在收报文,当object ID小的那一个硬件对象的缓存区满了,就会存入object ID大的那一个硬件对象,所以在调试的时候上层能收到对应的报文。

1万+

被折叠的 条评论
为什么被折叠?



