Linux can总线过度重传

Linux can总线过度重传,linux,can-bus,Linux,Can Bus,我正在做一个项目,涉及一个支持CAN总线的linux嵌入式设备 我注意到,如果我尝试在没有任何连接到CAN总线的情况下发送CAN数据包,内核会自动重新尝试传输无限次。我可以使用一个作用域来验证这一点——相同的消息会一次又一次地自动传输。即使我关闭了创建消息的进程,即使该进程只尝试传输一条消息,这种重新传输仍然会持续 我的问题是-这是linux CAN总线内核的正常行为吗?我担心的是,如果设备出了什么问题,并且错误地认为它在公交车上是单独的,那么该设备可能会淹没公交车,使其他公交车参与者无法使用。

我正在做一个项目,涉及一个支持CAN总线的linux嵌入式设备

我注意到,如果我尝试在没有任何连接到CAN总线的情况下发送CAN数据包,内核会自动重新尝试传输无限次。我可以使用一个作用域来验证这一点——相同的消息会一次又一次地自动传输。即使我关闭了创建消息的进程,即使该进程只尝试传输一条消息,这种重新传输仍然会持续

我的问题是-这是linux CAN总线内核的正常行为吗?我担心的是,如果设备出了什么问题,并且错误地认为它在公交车上是单独的,那么该设备可能会淹没公交车,使其他公交车参与者无法使用。我本以为会有某种重试限制


该设备使用linux 4.14.48,can芯片为飞利浦SJA1000。

您看到的可能是错误帧。合规行为是这样的:

  • 节点处于活动状态。它试图发送一个数据帧,但没有得到ACK位设置,因为没有人在听它
  • 它将发送一个错误帧,该帧几乎只包含6个主要位,用于故意破坏位填充
  • 控制器将重新尝试发送消息。如果在未接收ACK的情况下再次尝试发送,将发送另一个错误帧。这将自动重复
  • 在128个错误之后,节点将变为错误被动,在那里它仍将发送错误帧,但现在处于隐性级别,不会中断其他通信
  • 在总共256个错误之后,节点将关闭总线并完全关闭
这一切都应由CAN控制器硬件处理,而不是由操作系统处理。一旦SJA1000总线断开,您可能需要将其复位或重启。如果它从未关闭总线,则在出现一定数量的错误后,驱动程序代码中的某些内容可能会持续重置CAN控制器


请注意,微控制器的实现可能会采取相同的行动,并在出现错误时重置,因为这通常是在总线断开后重新建立通信的唯一方法。这取决于CAN应用程序的性质。

感谢您的回复!那我的设备肯定出问题了。它不传输错误帧,它只是不断地连续不断地、毫不延迟地、永远地输出同一帧。如果我没看错的话,这是对CAN总线规范的公然违反。@avl_瑞典是啊。。。发生故障时,驾驶员可能正在重置控制器。但我仍然希望在这种情况下看到一些错误帧。你确定你没有在“环回”中运行它吗?也就是说,在调试模式下,控制器被告知与自身对话,而忽略实际总线?我不认为它处于“环回”状态。只要我将某个东西连接到总线上,某个响应为“Ack”的东西,总线就会正常工作。只有在没有响应时才会出现问题。但我现在注意到了一些事情。它确实传输错误帧。前16次重传之后实际上附加了一个错误帧!根据此链接:,发送错误计数器不应仅仅因为错误被动节点未接收ack而增加。难道这就是为什么它永远不会去巴士站?那么,原则上,也许没有什么问题?有一点奇怪,因为它有有限的重新传输?@avl_瑞典我不记得所有肮脏的细节,但想想看,它可能会一直发送错误帧,特别是无确认错误。我得去读一下罐头的标准。